Is there a way in the following Combine chain to handle all errors at one place ?. If I don't handle the error in flatMap, the $text
publisher will never emit again. Thank you.
$text
.debounce(for: .seconds(0.5), scheduler: DispatchQueue.main)
.flatMap {
Repository().retrieve(query: $0)
.receive(on: DispatchQueue.main)
.catch { err -> AnyPublisher<[Beer], Never> in
self.serverError = err.displayValue
return Just([]).eraseToAnyPublisher()
}
}
.map { $0.map { ItemViewModel($0) } }
.receive(on: DispatchQueue.main)
.sink {[weak self] val in
self?.items = val
}.store(in: &cancellables)
Thank you @NevDev and @matt for pushing me in the correct direction.
lazy var publisher: AnyPublisher<Result<[ItemViewModel], RepositoryError>, Never> = {
$text
.debounce(for: .seconds(0.5), scheduler: DispatchQueue.main)
.flatMap {
Repository().retrieve(query: $0)
.map { Result.success($0.map { ItemViewModel($0) }) }
.catch { error in Just(Result.failure(error)) }
}
.eraseToAnyPublisher()
}()
init() {
publisher
.receive(on: DispatchQueue.main)
.sink {[weak self] value in
switch value {
case let .success(items): self?.items = items
case .failure(let error): self?.serverError = error.displayValue
}
}
.store(in: &cancellables)
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With