Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c &引用;“合并最新版本”;有反应的可可和信号的信号_Objective C_Reactive Cocoa - Fatal编程技术网

Objective c &引用;“合并最新版本”;有反应的可可和信号的信号

Objective c &引用;“合并最新版本”;有反应的可可和信号的信号,objective-c,reactive-cocoa,Objective C,Reactive Cocoa,在ReactiveCocoa中实现信号中信号的“最新组合”的最佳方法是什么?我有以下问题: 给定N个文本字段,订阅UIControlEditingEventChanged事件,并基于调用的值创建新信号。每个订阅服务器执行一次订阅,然后将这些值相互结合使用。下面是我得到的: __block NSMutableSet *subscriptions = [NSMutableSet set]; RACSignal *validationSignals = [[[[TEXT_FIELDS rac_sequ

在ReactiveCocoa中实现信号中信号的“最新组合”的最佳方法是什么?我有以下问题:

给定N个文本字段,订阅
UIControlEditingEventChanged
事件,并基于调用的值创建新信号。每个订阅服务器执行一次订阅,然后将这些值相互结合使用。下面是我得到的:

__block NSMutableSet *subscriptions = [NSMutableSet set];
RACSignal *validationSignals = [[[[TEXT_FIELDS rac_sequence].signal flattenMap:^RACStream* (UITextField *textField) {
    return [textField rac_signalForControlEvents:UIControlEventEditingChanged];
}] flattenMap:^RACStream *(UITextField* textField) {
    if(![subscriptions containsObject:textField]) {
         [subscriptions addObject:textField];
        return [textField rac_validationSignal];
    }
    return [RACSignal empty];
}]];
其中,
rac\u validationSignal
是我自己处理UITextFields验证的类。信号正确通过,但一次只能通过一个。我需要一次获得所有订阅的值,以便获得所有已编辑字段的有效性

编辑:

一个可能的解决方案涉及一个可变数组,我将新字段添加到该数组中,并像平常一样发送组合信号。这似乎很好,还有其他想法吗

__block NSMutableSet *subscriptions = [NSMutableSet set];
__block NSMutableArray *signals = [NSMutableArray array];
RAC(self.editButton, enabled) =
[[[[TEXT_FIELDS rac_sequence].signal flattenMap:^RACStream* (UITextField *textField) {
    return [textField rac_signalForControlEvents:UIControlEventEditingChanged];
}] flattenMap:^RACStream *(UITextField* textField) {
    if(![subscriptions containsObject:textField]) {
        [subscriptions addObject:textField];
        [signals addObject:[textField rac_validationSignal]];
        return [RACSignal combineLatest:signals];
    }
    return [RACSignal empty];
}] map:^NSNumber *(RACTuple *value) {
    for(NSNumber *isValid in value) {
        if(![isValid boolValue]) { return @(NO); }
    }
return @(YES);
}];

谢谢

你可以试试这个:

NSArray *TEXT_FIELDS = @[[txt1.rac_textSignal distinctUntilChanged],[txt2.rac_textSignal distinctUntilChanged]];
[[RACSignal combineLastest:TEXT_FIELDS reduce:^ (NSSTring *txt1, NSString *txt2) {
    // Return your validate method here
    // Signal only send `next` value it is different from previous `next` value 
    return [self inputvalication];
}] setKeyPath:@"enabled" onObject:self.myButton];

这与我所寻找的不一样。
CombineTest
接收“静态”信号数组。我对一个动态数组感兴趣,它在用户每次键入字段时都会更新。请参阅我的示例解决方案,以了解我正在寻找的工作示例。@MikkoHarju,很抱歉,我仍然不了解它,
rac\u textSignal
get updated everytime user type in a field,它不是静态的。如果我从所有文本字段创建一个数组,并对其运行
CombineTest
,信号将包含所有字段的内容,并且根据订阅
rac\U textSignal
的位置,它可能会在字段上返回空字符串或实际值。我只对用户实际修改过的内容感兴趣。这就是为什么我仅在为给定字段触发
UIControlEventEditingChanged
事件后才订阅。关于
-(RACSignal*)distinctuntillChanged
,它只发送
next
s,其中-isEqual:与之前的
next
相比返回否。我刚刚修改了我的答案,希望有帮助。不要忘记
-filter
,您可以过滤信号值并将其添加到所需的可变数组中。