2015-11-13 30 views
1
let (signal, sink) = Signal<[CLBeacon], BeaconManagerError>.pipe() 

当我打电话,是因为用户禁用蓝牙:ReactiveCocoa 4:如何发送错误观察者无需中断信号

sendError(self.sink, error) 

Signal被中断,我没有收到更多next在再次启用蓝牙后,也不会发生interrupted事件。 Signal已损坏。

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

回答

1

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

失败应该只用于表示“异常”终止。如果 让操作员(或消费者)完成他们的工作很重要,那么描述结果的Next事件可能更合适。

如果你想打开错误引入Next事件,您可以使用flatMapError操作所描述的here或使用retry,如果你希望只允许几个错误的occurances。

0

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

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

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