2

ReactiveCocoa 2.0 を使用して、マテリアライズ/デマテリアライズする必要がなく、コードを複製することなく、3 つのシグナルのいずれかからエラーをキャプチャすることなく、次のことを行うためのより良い方法はありますか?

ログインボタンは3つ。それぞれが、非同期の「ログイン」API 呼び出しに対応するシグナルを返します。それらが完了すると、ユーザー オブジェクト、エラー、および/または完了が返されます。

// Login signals
_loginButton.rac_command = [[RACCommand alloc] initWithEnabled:loginValid signalBlock:^RACSignal *(id input) {
    return [[API doLogin:_usernameField.text password:_passwordField.text] materialize];
}];
_fbLoginButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    return [[API doFacebookLogin] materialize];
}];
_twLoginButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    return [[API doTwitterLogin] materialize];
}];

// Login response from any of the 3 signals
[[RACSignal
  merge:@[_loginButton.rac_command.executionSignals,
          _fbLoginButton.rac_command.executionSignals,
          _twLoginButton.rac_command.executionSignals]]
 subscribeNext:^(RACSignal *loginSignal) {
     RACSignal * s = [loginSignal dematerialize];
     [s subscribeNext:^(User *x) {
        NSLog(@"user: %@", x);
     } error:^(NSError *error) {
        NSLog(@"error: %@", error);
     } completed:^{
        NSLog(@"Completed.");
     }];
 }];
4

1 に答える 1