【问题标题】:How to restart dataTaskPublisher after failure?失败后如何重启dataTaskPublisher?
【发布时间】:2020-08-03 20:44:50
【问题描述】:

我有一些代码会在计数值更改时向网络发出请求

@Published var count: Float = 0

init(data: SomeData) {
///
   $count
      .debounce(for: .seconds(1), scheduler: RunLoop.main)
      .filter { return $0 != self.product.quantity }
      .setFailureType(to: APIProviderError.self)
      .flatMap { val -> AnyPublisher<Cart, APIProviderError> in
            return self.cartService.update(item: params)
         }
      }
      .sink { result in
         print(result)
      } receiveValue: { cart in
         print(cart)
      }
      .store(in: &cancellable)
///
}

cartService.update 返回 dataTaskPublisher。

当返回任何错误时,永远不会再次调用平面地图。 可以重启吗?

【问题讨论】:

  • 旁注:您可以使用removeDuplicates() 发布者代替过滤器。

标签: ios swift reactive-programming combine


【解决方案1】:

我可以重新启动它吗?

没有。在Combine框架中,当一个管道发生故障时,整个管道被取消,发布者完成。

但是,在您的 flatMap 中,您可以构建一个迷你管道来执行 catch 并防止故障逃逸到外部管道中。如果需要,您可以继续使用外部管道。

另外,如果您认为它有任何好处,您可以使用retry 防止错误传播,这将再次尝试获取。数据任务发布者只获取一次,除非 retry 让它再次尝试。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2015-01-08
  • 2020-05-22
  • 2018-04-15
  • 2020-05-21
相关资源
最近更新 更多