Consider an example (paraphrased) from the ReactiveCocoa Introduction, which
enables based on whether the .password and .passwordConfirm text fields match:
RAC(self.enabled) = [RACSignal 
    combineLatest:@[ RACAble(self.password), RACAble(self.passwordConfirm) ] 
    reduce:^(NSString *password, NSString *passwordConfirm) {
        return @([passwordConfirm isEqualToString:password]);
    }];
Here we know at compile time how many and what things we are combining, and it is useful to destructure/map the "combine" array into multiple arguments to the reduce block. What about when that won't work. For instance, if you want:
RAC(self.enabled) = [RACSignal 
    combineLatest:arrayOfSignals 
    reduceAll:^(NSArray *signalValues) {  // made this up! don't try at home.
        // something ...
    }];
How do you do this with ReactiveCocoa?
UPDATE: the accepted answer's comments help explain what I was missing.
You can use map:
RAC(self.enabled) = [[RACSignal combineLatest:arrayOfSignals]
                     map:^(RACTuple *signalValues) {
                       // something
                     }
                    ];
A RACTuple can be manipulated in many ways, it conforms NSFastEnumeration, it has the allObjects method and also the rac_sequence method. You can for example combine all boolean values this way:
RAC(self.enabled) = [[RACSignal combineLatest:arrayOfSignals]
                     map:^(RACTuple *signalValues) {
                       return @([signalValues.rac_sequence all:^BOOL(NSNumber *value) {
                         return [value boolValue];
                       }]);
                     }
                    ];
Hope it helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With