King
King

Reputation: 2025

Switching viewModels with flatMap swift

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

Answers (1)

jboulter11
jboulter11

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

Related Questions