RACSignal:如何减少任意大型联合收割机

Cla*_*ges 4 objective-c reactive-programming reactive-cocoa

考虑ReactiveCocoa简介中的一个示例(释义),该示例根据.password.passwordConfirm文本字段是否匹配来启用:

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

在这里,我们在编译时知道我们正在组合多少和什么东西,并且将"combine"数组解构/映射到reduce块的多个参数是有用的.什么时候不起作用.例如,如果你想:

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

你如何用ReactiveCocoa做到这一点?

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

yon*_*ytu 7

你可以使用map:

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

A RACTuple可以通过多种方式进行操作,它符合NSFastEnumeration,有allObjects方法和rac_sequence方法.例如,您可以通过以下方式组合所有布尔值:

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

希望能帮助到你.

  • `+ combineLatest:`生成元组,所以是的,你可以说它的基数为1.'rece`变量解包元组并将元组的各个值传递给`reduce`块.`+ combineLatest:reduce:`是进行两个单独操作的便捷方式:`+ combineLatest:`后跟`-reduceEach:`.这有助于解释它吗? (2认同)