В приведенном ниже примере «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 делают создание таких расширений очень сложным (если не невозможным?).