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

时间:2015-06-13 12:56:05

标签: objective-c reactive-cocoa

我有许多网络请求,其中一个或多个会返回有效数据,有些可能会返回错误。如果第一个有效数据返回数据但如果发生错误则不能停止,如何将此请求组合停止。

我试过这样:

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

我的问题:

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

1 个答案:

答案 0 :(得分:2)

试试这个:

[[[[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事件后完成。