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);
}];
謝謝!
這不會做同樣的事情,因爲我一直在尋找。 'combineLatest'接受一個「靜態」信號陣列。我對每次用戶在字段中輸入時都會更新的動態數組感興趣。查看我的示例解決方案,查找我正在尋找的示例。 –
@MikkoHarju,對不起,我還是不明白,'rac_textSignal'每次用戶在字段中輸入時都會更新,它不是靜態的。 – babygau
如果我應該從所有文本字段中創建一個數組並在其上運行'combineLatest',那麼信號將包含所有這些字段的內容,並且根據我在哪裏訂閱'rac_textSignal',它可能會返回空字符串或實際值在田野上。 我只對那些實際上由用戶修改的人感興趣。這就是爲什麼我只在爲給定字段觸發'UIControlEventEditingChanged'事件後訂閱。 –