在下面的示例中,永远不会打印“2”,因为错误是一个完成事件,会阻止发布者发送更多事件。这对我来说很清楚。
import Combine
enum TestError: Error {
case ohnoes
}
let publisher = PassthroughSubject<Int, Error>()
publisher
.sink(receiveCompletion: { completion in
print(completion)
}) { int in
print(int)
}
publisher.send(1)
publisher.send(completion: .failure(TestError.ohnoes))
publisher.send(2)
可悲的是,即使replaceError
并且catch
不会停止完成事件,所以管道仍然会结束。
所以我的问题是,如何用nil
值替换错误并防止完成事件?基本上我想转换AnyPublisher<Int, Error>
成AnyPublisher<Int?, Never>
,对于那些我根本不关心错误,只想继续接收未来值的情况。
使用 ReactiveKit 我有这个扩展:
extension Signal {
func errorToOptional() -> Signal<Element?, Never> {
return Signal<Element?, Never> { observer in
self.observe { event in
switch event {
case .next(let element):
observer.receive(element)
case .failed:
observer.receive(nil)
case .completed:
observer.receive(completion: .finished)
}
}
}
}
}
而且效果很好。但是,Combine 类型使得创建这样的扩展非常困难(如果不是不可能的话?)。