3
let (signal, sink) = Signal<[CLBeacon], BeaconManagerError>.pipe()

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

sendError(self.sink, error)

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

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

4

2 回答 2

1

Next* (Error|Completed)如果您想要与我建议在类型中编码不同的语义。您可以使用一个Signal不会失败的值,但其值可以是 success 或 failure,方法是Result

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

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

于 2015-12-01T00:19:55.613 回答
1

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

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

如果您想将错误转换为Next事件,您可以使用此处flatMapError描述的运算符,或者如果您只想允许错误发生几次,则使用。retry

于 2015-11-13T10:42:16.667 回答