我可以合并RAC信号但仍然可以单独获得每个错误吗?

时间:2014-08-20 14:54:47

标签: ios objective-c reactive-cocoa

更新

而不是:

RACSignal * mergedItemsSignals = [RACSignal merge:itemSignalsArray];

生成这样的新信号:

RACSignal * mergedItemsSignals = [RACSignal merge:[itemSignalsArray.rac_sequence map:^id(RACSignal * signal) {
        return [signal materialize];
    }]];

当您订阅时,您希望使用RACEvents来区分[RACEvent eventType]


对于一系列信号,我希望能够单独处理每个next和每个error。但我很难找到合适的运营商。到目前为止,似乎正确的选择是

merge返回一个信号,该信号通过每个给定信号的值,并在所有信号完成时发送completed。如果任何信号发送错误,则返回的信号会立即发送error

所以,似乎我需要类似的东西。我希望收到所有错误,但统一信号应该继续工作而不是完成第一个错误。

我也试过使用'combineLatest',但这只是在每个信号发送一些东西后转发事件,我想尽快开始转发每个信号。

希望它足够清楚,有人可以指出我正确的方向。 提前谢谢!

1 个答案:

答案 0 :(得分:4)

信号只能出错一次,因此您需要一种方法将error转换为next s。幸运的是,materialize就是这样 - 给定一个信号,它会从该信号中向您发出事件的信号。然后,您可以将其拆分为两个信号,用于错误和nexts,或者只是在一个块中处理它们。

因此,您可以获取信号列表,映射materialize,然后合并生成的映射信号。

- (RACSignal *)mergeEvents:(NSArray *)signals {
    return [RACSignal merge:[signals.rac_sequence map:^(RACSignal *signal) {
        return [signal materialize];
    }]];
}