"Объединить последние" с ReactiveCocoa и сигналом сигналов

Каков наилучший подход для реализации "объединения последних" для сигналов сигналов в 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_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);
}];

Спасибо!

1 ответ

Вы можете попробовать это:

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];
Другие вопросы по тегам