2013-10-08 79 views
4

在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]; 
+0

這不會做同樣的事情,因爲我一直在尋找。 'combineLatest'接受一個「靜態」信號陣列。我對每次用戶在字段中輸入時都會更新的動態數組感興趣。查看我的示例解決方案,查找我正在尋找的示例。 –

+0

@MikkoHarju,對不起,我還是不明白,'rac_textSignal'每次用戶在字段中輸入時都會更新,它不是靜態的。 – babygau

+0

如果我應該從所有文本字段中創建一個數組並在其上運行'combineLatest',那麼信號將包含所有這些字段的內容,並且根據我在哪裏訂閱'rac_textSignal',它可能會返回空字符串或實際值在田野上。 我只對那些實際上由用戶修改的人感興趣。這就是爲什麼我只在爲給定字段觸發'UIControlEventEditingChanged'事件後訂閱。 –