听听变化rxswift

时间:2019-11-21 12:23:15

标签: swift rx-swift

我正在使用Deeplink打开我的应用程序,因此,如果点击a按钮,则用户会收到一封电子邮件,依次单击该链接并将其定向到他/她当前所在的页面。我正在使用MVVM体系结构,并且我希望能够基于从api调用获得的结果进行更改,该调用是在用户返回到App时发生的,但是我无法使Observable响应于Api响应

init(routeManager: RouteMatchResult?, provider: Api, currentEmail: String?) {
        self.routeManager = BehaviorRelay(value: routeManager)
        self.currentEmail = BehaviorRelay(value: currentEmail)
        nightModeEnabled = BehaviorRelay(value: ThemeType.currentTheme().isDark)
        super.init(provider: provider)
        self.dataXXX.accept(())
//        loadInvite()
    }

    func transform(input: Input) -> Output {

dataXXX.asObservable().subscribe({_ in
            print("DDDD=========++++++++++++==========DDDDD")
        }).disposed(by: rx.disposeBag)
       return Output()
}

但是,如果我取消注释loadInvite()的代码在该函数中运行,并且试图让dataXXX进行订阅将不起作用

func loadInvite() {

        routeManager.errorOnNil().asObservable()

            .flatMapLatest { (code) -> Observable<RxSwift.Event<User>> in
            log("=========++++++++++++==========")
//            guard let code = code else {return}
            let params = code.values

            return self.provider.postVerifyApp(challengeId: code)
            .trackActivity(self.loading)
            .trackError(self.error)
            .materialize()
        }.subscribe(onNext: { [weak self] (event) in
            log("=========++++++++++++==========+++++++++++", .fuck)
            switch event {
            case .next(let token):
                log(token)
                if token.data != nil {
                    self?.dataStatuBool.accept(true)
                    self?.dataStatus.onNext(true)
                    log("=========++++++++++ TRUE ========+++++++++++", .fuck)
                    self?.homeData.onNext(())
                } else {
                    self?.nilData.onNext(())
                    self?.dataStatuBool.accept(false)
                    self?.dataStatus.onNext(false)
                    log("=========+++++++++ FALSE ======+++++++++++", .fuck)
                }
            case .error(let error):
                log(error.localizedDescription)
            default: break
            }
        }).disposed(by: rx.disposeBag)

        nilData.asObservable().flatMapLatest { () -> Observable<EmailSharingViewModel> in
            print("SUBBBBBBB XXX")
            let viewModel = EmailSharingViewModel(provider: self.provider)
            return Observable.just(viewModel)
        }.subscribe()
        .disposed(by: rx.disposeBag)
    }
}

1 个答案:

答案 0 :(得分:0)

我认为这里的主要问题是,当您self.dataXXX.accept(())进行观察时,尚未订阅。通常,在MVVM体系结构中,您的订阅应在视图控制器的viewDidLoad()中进行,而不是在视图模型中进行,视图模型仅负责组成和公开所需的所有可观察对象,并在视图控制器中进行订阅。

在此处检查示例:https://github.com/uptechteam/Coordinator-MVVM-Rx-Example/tree/master/MVVM-Rx/RepoSearcher/Classes/RepositoryList