Объединить: можно ли заменить ошибку на ноль? - PullRequest
0 голосов
/ 14 февраля 2020

В приведенном ниже примере «2» никогда не будет напечатано, поскольку ошибка является событием завершения, не позволяющим издателю отправлять больше событий. Это очень ясно для меня.

import Combine

enum TestError: Error {
  case ohnoes
}

let publisher = PassthroughSubject<Int, Error>()

publisher
  .sink(receiveCompletion: { completion in
  print(completion)
}) { int in
  print(int)
}

publisher.send(1)
publisher.send(completion: .failure(TestError.ohnoes))
publisher.send(2)

К сожалению, даже replaceError и catch не остановят событие завершения, поэтому конвейер все равно закончится.

Так что мой вопрос Как я могу заменить ошибку значением nil и предотвратить событие завершения? По сути, я хочу преобразовать AnyPublisher<Int, Error> в AnyPublisher<Int?, Never>, для тех случаев, когда мне просто наплевать на ошибку, и я просто хочу продолжать получать будущие значения.

С ReactiveKit у меня было это расширение :

extension Signal {
  func errorToOptional() -> Signal<Element?, Never> {
    return Signal<Element?, Never> { observer in
      self.observe { event in
        switch event {
        case .next(let element):
          observer.receive(element)
        case .failed:
          observer.receive(nil)
        case .completed:
          observer.receive(completion: .finished)
        }
      }
    }
  }
}

И это прекрасно работало. Но типы Combine делают создание таких расширений очень сложным (если не невозможным?).

1 Ответ

0 голосов
/ 14 февраля 2020

Вы сказали

publisher.send(completion: .failure(TestError.ohnoes))

Издатель, следовательно, выдает ошибку. Это то, что вы сказали, чтобы сделать это. Если издатель выдает ошибку, он по определению мертв. Вот что значит неудача в Combine. Вы не можете сделать ничего ниже по течению от издателя, что волшебным образом изменит это.

Итак, мой вопрос: как я могу заменить ошибку значением nil и предотвратить событие завершения?

Вы можете предотвратить ошибку (отказ) до достижения тонуть, помещая что-то между издателем и приемником, который улавливает ошибку или преобразует ее в никогда. Но вы не можете предотвратить неудачу издателя, потому что это то, что вы только что сказали.

По сути, я хочу преобразовать AnyPublisher в AnyPublisher, для тех случаев, когда мне просто наплевать на ошибку, и я просто хочу продолжать получать будущие значения.

От этого издателя не будет никаких будущих ценностей. Это не удалось. Вот что означает ошибка . И это то, что вы сказали издателю сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...