2013-07-12 7 views
4

Рассмотрим пример (переоформленную) из ReactiveCocoa Introduction, который позволяет в зависимости от того совпадают .password и .passwordConfirm текстовые поля:RACSignal: как уменьшить на сколь угодно большой объединить

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

Здесь мы знаем, во время компиляции хау многие и то, что мы объединяем, и полезно разрушить/сопоставить массив «комбинировать» с несколькими аргументами в блок уменьшения. Как насчет того, когда это не сработает. Например, если вы хотите:

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

Как вы это делаете с ReactiveCocoa?

ОБНОВЛЕНИЕ: комментарии принятого ответа помогают объяснить, что мне не хватает.

ответ

7

Вы можете использовать карту:

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

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]; 
         }]); 
        } 
        ]; 

Надеюсь, что это поможет.

+0

Спасибо. У меня есть «карта:» для работы. Терминология меня отбрасывает. На мой взгляд, обобщенная идея карты состоит в том, что она сохраняет мощность. Если я могу отобразить из объединенного «RACSignal» в одно значение, значит ли это, что его мощность равна 1? Если это так, метод 'combLatest: reduce:', который уменьшает несколько значений, кажется немного мутным. –

+2

'+ combLatest:' создает кортежи, поэтому да, вы можете сказать, что он имеет мощность 1. Вариант 'reduce' распаковывает кортеж и передает индивидуальные значения кортежа в блок' reduce'. '+ combinationLatest: reduce:' является удобным способом для выполнения двух отдельных операций: '+ combinationLatest:', за которым следует '-reduceEach:'. Помогает ли это объяснить это? –

+0

@DaveLee: * очень * прозрачный, спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^