如何判断RxSwift无论成功与否都能做某事

问题描述 投票:0回答:1

我在调用服务的类上有一个方法,它使用该服务的响应将ID传递给另一个服务,进行第二次调用。

如果其中任何一个失败或序列完成,我想调用另一个函数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)
    }

目前我在订阅块中执行此操作,但是在发生错误时不会调用此方法。在前两个操作之后调用此操作非常重要。

ios swift rx-swift
1个回答
0
投票

对于这个和类似的问题,您想要概述执行此输出的所有原因并使它们成为相关流的输入。

您希望在第一次调用失败或第二次调用发出停止事件时调用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,但我希望你也想订阅currentUsercompany来做些什么。在这种情况下,您应该将share放在公司流上,就像它已经在currentUser流上一样。

© www.soinside.com 2019 - 2024. All rights reserved.