Как я могу сказать RxSwift сделать что-то независимо от успеха или неудачи - PullRequest
0 голосов
/ 07 марта 2019

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

Если один из них завершается неудачно или когда последовательностьзавершено, я хотел бы вызвать другую функцию self.showHomeScene()

   private func getPropsForHomeScene() {

        profileService.fetchCurrentUser()
            .map { $0.company }
            .flatMap(companyService.fetchCompany)
            .distinctUntilChanged()
            .subscribe(onNext: { company in
                 self.showHomeScene()
            }, onError: { err in
                print(err.localizedDescription)
            }).disposed(by: disposeBag)
    }

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

1 Ответ

0 голосов
/ 08 марта 2019

Для этого и для подобных вопросов вы хотите изложить все причины для выполнения этого вывода и сделать их входными данными для рассматриваемого потока.

Вы хотите, чтобы метод showHomeScene () вызывался при первомвызов завершается неудачно или когда второй вызов генерирует событие остановки.

private func getPropsForHomeScene() {
    let currentUser = profileService.fetchCurrentUser()
        .share(replay: 1)

    let company = currentUser
        .map { $0.company }
        .flatMap { companyService.fetchCompany($0) }

    let currentUserFailed = currentUser
        .materialize()
        .map { $0.error }
        .filter { $0 != nil }
        .map { _ in }

    let companyStopped = company
        .materialize()
        .filter { $0.isStopEvent }
        .map { _ in }

    Observable.merge(currentUserFailed, companyStopped)
        .subscribe(onNext: {
            self.showHomeScene()
        })
        .disposed(by: disposeBag)
}

Я замечаю, что вы ничего не делаете с фактической компанией или текущими объектами пользователя, которые выбираются.Это не влияет на это subscribe конечно, но я ожидаю, что вы захотите подписаться на currentUser и company, чтобы что-то с ними делать.В этом случае вы должны поместить share в поток компании, как если бы он уже был в потоке currentUser.

...