Objective c 如何合并多个信号并在第一个和下一个停止,但不在第一个错误时停止?

Objective c 如何合并多个信号并在第一个和下一个停止,但不在第一个错误时停止?,objective-c,reactive-cocoa,Objective C,Reactive Cocoa,我有许多网络请求,其中一个或多个请求将返回有效数据,有些请求可能返回错误。我如何组合此请求以在第一个有效的返回数据后立即停止,但在出现错误时不停止 我试过这样做: [[RACSignal merge:@[sigOne, sigTwo, sigThree]] subscribeNext:^(RACTuple *myData){ NSLog(@"Data received"); } error:^(NSError *error) {

我有许多网络请求,其中一个或多个请求将返回有效数据,有些请求可能返回错误。我如何组合此请求以在第一个有效的返回数据后立即停止,但在出现错误时不停止

我试过这样做:

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

  • 如果其中一个信号首先返回并出现错误,则不会发送下一个信号。不需要,因为其他信号之一将返回有效数据
  • 如果所有三个都返回有效数据,那么subscribeNext将被调用三次,但我希望在获得一些有效数据后立即停止(以减少网络流量)
试试这个:

[[[[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
,而不会结束对其他信号的订阅。 通过添加repeat,如果没有发生
next
事件(因为所有信号都出错),我们将获得再次运行的信号。
通过添加
take:1
,一旦收到单个
下一个
事件,信号将完成。

谢谢你,伙计!这就是我要找的。如果所有信号都返回错误,有没有办法完成合并信号?是的,很简单,只需删除repeat方法。