将给定的发布者失败类型设置为“从不合并”

时间:2019-10-03 21:26:04

标签: ios swift frp combine

是否可以将给定的AnyPublisher<AnyType, SomeError>转换为AnyPublisher<AnyType, Never>

2 个答案:

答案 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()传递的错误,您的应用将立即崩溃。