>我有一个视图模型,我正在执行基于布尔值的检查。对/错。此值传递到PublishSubject<Bool>()
现在我想使用 flatMapLatest 获取最新值,并根据 True/False 的值使用另一个不同的 ViewModel 进行导航
routeManager.errorOnNil().asObservable()
.flatMapLatest { (code) -> Observable<RxSwift.Event<User>> in
let params = code.values
let challengeId = Int(params["challengeId"] as? String ?? "0")
return self.provider.postVerifyApp(challengeId: login.challengeId!)
.trackActivity(self.loading)
.trackError(self.error)
.materialize()
}.subscribe(onNext: { [weak self] (event) in
switch event {
case .next(let token):
log(token)
if token.data != nil {
self?.dataStatus.onNext(true)
} else {
self?.dataStatus.onNext(false)
}
case .error(let error):
log(error.localizedDescription)
default: break
}
}).disposed(by: rx.disposeBag)
在哪里切换
dataStatus.flatMapLatest { (status) -> ViewModel in
if status {
let viewModel = XXXViewModel(provider: self.provider)
return viewModel
} else {
let viewModel = YYYYViewModel(provider: self.provider)
return viewModel
}
}.subscribe()
.disposed(by: rx.disposeBag)
这会产生错误Instance method 'flatMapLatest' requires that 'ViewModel' conform to 'ObservableConvertibleType'
.flatMapLatest
和.flatMap
将Observable
类型作为其闭包的返回值。 您需要返回包装在可观察量中的viewModel
。 .flatMapLatest
会将其扁平化,当您订阅时,您将获得viewModel
对象。
dataStatus.flatMapLatest { (status) -> Observable<ViewModel> in
if status {
let viewModel = XXXViewModel(provider: self.provider)
return Observable.just(viewModel)
} else {
let viewModel = YYYYViewModel(provider: self.provider)
return Observable.just(viewModel)
}
}.subscribe()
.disposed(by: rx.disposeBag)