4

考虑ReactiveCocoa Introduction中的一个示例(转述),它根据.password.passwordConfirmtext 字段是否匹配来启用:

RAC(self.enabled) = [RACSignal 
    combineLatest:@[ RACAble(self.password), RACAble(self.passwordConfirm) ] 
    reduce:^(NSString *password, NSString *passwordConfirm) {
        return @([passwordConfirm isEqualToString:password]);
    }];

在这里,我们在编译时知道我们正在组合多少和什么东西,并且将“组合”数组解构/映射为 reduce 块的多个参数很有用。那什么时候行不通。例如,如果你想:

RAC(self.enabled) = [RACSignal 
    combineLatest:arrayOfSignals 
    reduceAll:^(NSArray *signalValues) {  // made this up! don't try at home.
        // something ...
    }];

你如何用ReactiveCocoa做到这一点?

更新:接受的答案的评论有助于解释我所缺少的。

4

1 回答 1

7

您可以使用地图:

RAC(self.enabled) = [[RACSignal combineLatest:arrayOfSignals]
                     map:^(RACTuple *signalValues) {
                       // something
                     }
                    ];

ARACTuple可以通过多种方式进行操作,它符合NSFastEnumeration,它有allObjects方法,也有rac_sequence方法。例如,您可以通过这种方式组合所有布尔值:

RAC(self.enabled) = [[RACSignal combineLatest:arrayOfSignals]
                     map:^(RACTuple *signalValues) {
                       return @([signalValues.rac_sequence all:^BOOL(NSNumber *value) {
                         return [value boolValue];
                       }]);
                     }
                    ];

希望能帮助到你。

于 2013-07-12T16:02:43.283 回答