将给定的 Publishers Failure 类型设置为 Never in Combine
Set a given Publishers Failure type to Never in Combine
有没有办法将给定的 AnyPublisher<AnyType, SomeError>
转换为 AnyPublisher<AnyType, Never>
?
错误类型为 Never
的发布者意味着它根本不会抛出错误。它总会带来价值。
要获得永远不会抛出错误的发布者,您有 2 个解决方案:
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()
传递的错误,您的应用将立即崩溃。
使用 replaceError
运算符。这要求您发出一个 AnyType 值,如果上游出现错误,该值将从此处沿着管道向下发送。
例如:
URLSession.shared.dataTaskPublisher(for: url)
.map {[=10=].data} // *
.replaceError(with: Data()) // *
// ...
从管道的这一点开始,我们保证将收到来自数据任务完成的数据或(如果存在网络错误)空数据。从这一点开始,管道的失败类型是从不。
有没有办法将给定的 AnyPublisher<AnyType, SomeError>
转换为 AnyPublisher<AnyType, Never>
?
错误类型为 Never
的发布者意味着它根本不会抛出错误。它总会带来价值。
要获得永远不会抛出错误的发布者,您有 2 个解决方案:
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()
传递的错误,您的应用将立即崩溃。
使用 replaceError
运算符。这要求您发出一个 AnyType 值,如果上游出现错误,该值将从此处沿着管道向下发送。
例如:
URLSession.shared.dataTaskPublisher(for: url)
.map {[=10=].data} // *
.replaceError(with: Data()) // *
// ...
从管道的这一点开始,我们保证将收到来自数据任务完成的数据或(如果存在网络错误)空数据。从这一点开始,管道的失败类型是从不。