是否可以将给定的AnyPublisher<AnyType, SomeError>
转换为AnyPublisher<AnyType, Never>
?
答案 0 :(得分:5)
使用replaceError
运算符。这就要求您发出一个AnyType值,如果错误是从上游到达的,则此点将从管道向下发送。
例如:
URLSession.shared.dataTaskPublisher(for: url)
.map {$0.data} // *
.replaceError(with: Data()) // *
// ...
从这一点开始,我们保证从数据任务完成中获得的数据或(如果存在网络错误)将接收到空数据。从这一点开始,管道的失败类型为从不。
答案 1 :(得分:1)
错误类型为Never
的发布者意味着它根本不会抛出错误。它将始终提供价值。
要获得一个永远不会抛出错误的发布者,您有两种解决方法:
1 /捕获所有可能的错误:
let publisher: AnyPublisher<AnyType, SomeError> = //...
publisher.catch { error in
// handle the error here. The `catch` operator requires to
// return a "fallback value" as a publisher
return Just(/* ... */) // as an example
}
2 /如果您确定发布者不会抛出任何错误,则可以使用.assertNoFailure()
,它将转换您的发布者。请注意,这是通过.assertNoFailure()
传递的错误,您的应用将立即崩溃。