ReactiveCocoaでシグナルのシグナルに「最新の結合」を実装するための最良のアプローチは何ですか? 次の問題があります。
N 個のテキスト フィールドを指定して、UIControlEditingEventChanged
イベントをサブスクライブし、呼び出された値に基づいて新しいシグナルを作成します。サブスクリプションはサブスクライバーごとに 1 回行われ、値は相互に組み合わせて使用されます。だからここに私が持っているものがあります:
__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 の検証を処理する独自のクラスはどこにありますか。信号は正しく通過しますが、一度に 1 つだけです。編集されたすべてのフィールドの有効性を得るために、一度にすべてのサブスクリプションの値が必要です。
編集:
考えられる解決策の 1 つは、通常どおりに新しいフィールドを追加して組み合わせシグナルを送信する可変配列を使用することです。これはかなり良さそうですが、他に何かアイデアはありますか?
__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);
}];
ありがとう!