将给定的 Publishers 失败类型设置为 Never in Combine

mik*_*ike 11 frp ios swift combine

有没有办法将给定转换AnyPublisher<AnyType, SomeError>AnyPublisher<AnyType, Never>

rra*_*ael 12

具有Neveras 错误类型的发布者意味着它根本不能抛出错误。它将始终提供价值。

要获得永远不会抛出错误的发布者,您有两种解决方案:

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
}
Run Code Online (Sandbox Code Playgroud)

2/ 如果您确定发布者不会抛出任何错误,则可以使用.assertNoFailure(),这将转换您的发布者。请注意,这是一个错误传递.assertNoFailure(),您的应用程序将立即崩溃。


mat*_*att 11

使用 replaceError运算符。这要求您发出一个 AnyType 值,如果错误从上游到达,该值将从该点向下发送到管道。

例如:

URLSession.shared.dataTaskPublisher(for: url)
    .map {$0.data} // *
    .replaceError(with: Data()) // *
    // ...
Run Code Online (Sandbox Code Playgroud)

从这一点开始,我们保证从数据任务完成或(如果存在网络错误)接收到空数据。从这一点开始,沿管道向下的失败类型是从不。