Есть несколько вариантов.
Первый вариант - принятие вашей текущей реализации.Вы могли бы передать информацию в дополнение к ViewController в событии onNext наблюдаемой nextAction, которая расскажет, как показать VC.
Например, вы можете создать ассоциированное перечисление
// you can call it NextAction, Action etc
enum PresentationType {
case
push(UIViewController),
present(UIViewController)
}
ииспользуйте его так:
let nextAction = Observable.combineLatest(appVersionOutput, serviceAvailabilityOutput, getLanguagePackOutput,
resultSelector:
{ appVersion, _, _ -> PresentationType in
if appVersion.currentAppVersion == "1.0.0" {
let appServiceAvailability = Availability.shared.getAppStatus()
if appServiceAvailability {
return .push(LoginLandingViewController())
} else {
return .push(ServiceMaintenanceViewController()) // use .present if should present modally
}
} else {
return .present(UIAlertController())
}
})
// somewhere in viewController
viewModel.output.nextAction
.subscribe(onNext: { [weak self] action in
switch action {
case .push(let vc):
self?.navigationController?.pushViewController(vc, animated: true)
case .present(let vc):
self?.present(vc, animated: true, completion: nil)
})
.disposed(by: disposeBag)
Второй (и в некотором смысле более гибкий и тестируемый) вариант - создать отдельный класс Router, который отвечает за создание и отображение следующих экранов (с функциями showLogin
).showAlert
и т. Д.)Маршрутизатор может быть напрямую введен во ViewModel, и вы можете вызвать маршрутизатор для отображения следующих экранов, например, в событиях do (onNext) в ваших наблюдаемых объектах.