Reputation: 2025
I have a viewModel where I am performing a check based on bool. True / False. This value is passed into a PublishSubject<Bool>()
now I want to get the latestValue with flatMapLatest and navigate using another different ViewModel based on the value of True/False
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)
Where to switch
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)
this gives error Instance method 'flatMapLatest' requires that 'ViewModel' conform to 'ObservableConvertibleType'
Upvotes: 1
Views: 597
Reputation: 152
.flatMapLatest
and .flatMap
take Observable
types as return values for their closures. You need to return the viewModel
wrapped inside an observable. .flatMapLatest
will flatten that down and when you subscribe you'll get the viewModel
object.
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)
Upvotes: 2