Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift Combine Handling Errors in Flatmap [closed]

Tags:

ios

swift

combine

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)

like image 299
Jani Avatar asked Sep 13 '25 18:09

Jani


1 Answers

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)
  }
}
like image 53
Jani Avatar answered Sep 16 '25 09:09

Jani