如何合并多个信号并在第一个下一个停止而不是在第一个错误时停止?

How to merge multiple signal and stop on first next but not to stop on first error?

我有许多网络请求,其中一个或多个将 return 有效数据,并且可能有些 return 错误。我如何合并此请求以在第一个有效 returned 数据后停止,但在出现错误时不停止。

我试过这样的:

[[RACSignal merge:@[sigOne, sigTwo, sigThree]]
        subscribeNext:^(RACTuple *myData){
            NSLog(@"Data received");
        } error:^(NSError *error) {
            NSLog(@"E %@", error);
        }
        completed:^{
            NSLog(@"They're all done!");
        }
     ];

我的问题:

试试这个:

[[[[RACSignal merge:@[[sigOne catchTo:[RACSignal empty]], 
                      [sigTwo catchTo:[RACSignal empty]], 
                      [sigThree catchTo:[RACSignal empty]]]] 
                          repeat] take:1]
    subscribeNext:^(RACTuple *myData){
        NSLog(@"Data received");
    } error:^(NSError *error) {
        NSLog(@"E %@", error);
    }
    completed:^{
        NSLog(@"They're all done!");
    }
 ];

通过使用 catchTo:,信号在出错时被替换为空信号,这只会导致信号发送 complete,并且不会结束对所有其他信号的订阅. 通过添加重复,如果没有 next 事件发生(因为所有信号都出错),我们将再次向 运行 发送信号。 通过添加 take:1,信号将在收到单个 next 事件后完成。