【问题标题】:ReactiveCocoa 4: How to send error to an observer without interrupting the signalReactiveCocoa 4:如何在不中断信号的情况下向观察者发送错误
【发布时间】:2016-02-14 21:16:21
【问题描述】:
let (signal, sink) = Signal<[CLBeacon], BeaconManagerError>.pipe()

当我因为用户禁用蓝牙而调用它时:

sendError(self.sink, error)

Signal 被中断,再次启用蓝牙后我没有收到更多的nextinterrupted 事件。 Signal 坏了。

如何在不中断/破坏Signal 的情况下将error 类型发送到observer?我在 RAC 4 文档中找不到。谢谢!

【问题讨论】:

    标签: ios swift reactive-cocoa reactive-cocoa-3


    【解决方案1】:

    按照设计,错误会导致信号结束。 documentation 说:

    失败只能用于表示“异常”终止。如果 重要的是让运营商(或消费者)完成他们的工作, 描述结果的下一个事件可能更合适。

    如果您想将错误转换为Next 事件,您可以使用flatMapError 运算符,如here 所述,或者如果您只想允许错误出现几次,请使用retry

    【讨论】:

    • 您的两个链接现在都返回 404。
    【解决方案2】:

    如果您想要与 Next* (Error|Completed) 不同的语义,我建议在类型中对其进行编码。您可以使用不会失败的Signal但其中的值可以是成功或失败,通过使用Result

    Signal<Result<[CLBeacon], BeaconManagerError>, NoError>
    

    signal 不会发出任何错误,但它的Next 事件将是Result.Success&lt;[CLBeacon]&gt;Result.Failure&lt;BeaconManagerError&gt;,**并且在接收到Result.Failure 时信号不会终止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 2010-12-06
      • 2023-02-02
      相关资源
      最近更新 更多