如何合并多个信号并在第一个下一个停止而不是在第一个错误时停止?
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!");
}
];
我的问题:
- 如果第一个信号 return 出现错误,则不会发送下一个信号。不需要,因为其他信号之一将 return 有效数据。
- 如果所有三个 return 有效数据,则 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
,并且不会结束对所有其他信号的订阅.
通过添加重复,如果没有 next
事件发生(因为所有信号都出错),我们将再次向 运行 发送信号。
通过添加 take:1
,信号将在收到单个 next
事件后完成。
我有许多网络请求,其中一个或多个将 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!");
}
];
我的问题:
- 如果第一个信号 return 出现错误,则不会发送下一个信号。不需要,因为其他信号之一将 return 有效数据。
- 如果所有三个 return 有效数据,则 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
,并且不会结束对所有其他信号的订阅.
通过添加重复,如果没有 next
事件发生(因为所有信号都出错),我们将再次向 运行 发送信号。
通过添加 take:1
,信号将在收到单个 next
事件后完成。