Как перезапустить dataTaskPublisher после сбоя? - PullRequest
1 голос
/ 03 августа 2020

У меня есть код, который делает запрос к net при изменении значения счетчика

@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.

Когда возникает какая-либо ошибка возвращается, плоская карта больше не вызывается. Могу ли я его перезапустить?

1 Ответ

2 голосов
/ 03 августа 2020

Можно его перезапустить?

Нет. В структуре Combine, когда конвейер выходит из строя, весь конвейер отменяется и публикатор завершает работу.

Однако внутри вашего flatMap вы можете построить мини-конвейер, который выполняет catch и предотвращает отказ от утечки во внешний трубопровод. После этого при желании вы сможете продолжать использовать внешний конвейер.

Кроме того, если вы думаете, что это принесет пользу, вы можете предотвратить появление ошибки с помощью retry, который попытается выполнить выборку снова . Издатель задачи данных извлекает только один раз, если retry не заставляет его повторить попытку.

...