【问题标题】:Can I merge RAC signals but still get each error individually?我可以合并 RAC 信号但仍然单独得到每个错误吗?
【发布时间】:2014-08-20 14:54:46
【问题描述】:

更新:

代替:

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”,但这只会在每个信号发送某些内容后转发事件,并且我想尽快开始为每个信号转发。

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

【问题讨论】:

    标签: ios objective-c reactive-cocoa


    【解决方案1】:

    一个信号只能出错一次,因此您需要一种将这些errors 转换为nexts 的方法。幸运的是,materialize 就是这样做的——给定一个信号,它会根据该信号为您提供 events 的信号。然后,您可以将其拆分为两个信号,分别用于错误和下一个信号,或者只是在一个块中处理它们。

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

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

    【讨论】:

    • 这种方式可以让我在所有信号都失败/完成后进行处理,对吗?正如我所理解的,我会为所有内容获取下一个事件,无论是“下一个”、“错误”还是“完成”,都必须进行过滤,对吧?如果是这样,我将如何识别每个事件?谢谢!
    • @andres-ciano 您实际上收到了RACEvents 的信号,您可以检查eventType 以查看它是什么类型(然后深入了解error 或@ 987654329@ 视情况而定)。
    • 我不知道获取事件的类型。此外,刚刚尝试了您的解决方案,效果非常棒!谢谢!
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多