Coordinator-MVVM-Rx-Example
Coordinator-MVVM-Rx-Example copied to clipboard
Use Observable.defered in start method of coordinator.
Hi, guys!
Great article and idea! Thanks for sharing it ❤️
I have one proposal tho :)
I feel like it would be more aligned with nature of Observable
(side effects should happen on subscription) so in the start method e.g LanguageListCoordinator
instead of
override func start() -> Observable<CoordinationResult> {
let viewController = LanguageListViewController.initFromStoryboard(name: "Main")
let navigationController = UINavigationController(rootViewController: viewController)
let viewModel = LanguageListViewModel()
viewController.viewModel = viewModel
let cancel = viewModel.didCancel.map { _ in CoordinationResult.cancel }
let language = viewModel.didSelectLanguage.map { CoordinationResult.language($0) }
rootViewController.present(navigationController, animated: true)
return Observable.merge(cancel, language)
.take(1)
.do(onNext: { [weak self] _ in self?.rootViewController.dismiss(animated: true) })
}
use Observable.defered
override func start() -> Observable<CoordinationResult> {
return Observable.deferred {
let viewController = LanguageListViewController.initFromStoryboard(name: "Main")
let navigationController = UINavigationController(rootViewController: viewController)
let viewModel = LanguageListViewModel()
viewController.viewModel = viewModel
let cancel = viewModel.didCancel.map { _ in CoordinationResult.cancel }
let language = viewModel.didSelectLanguage.map { CoordinationResult.language($0) }
self.rootViewController.present(navigationController, animated: true)
return Observable.merge(cancel, language)
.take(1)
.do(onNext: { [weak self] _ in self?.rootViewController.dismiss(animated: true) })
}
}
Doing so we won't trigger navigation in case you do something like
let startObservable = start()
Thanks @sergdort. That's such an awesome suggestion! I'm going to update the repository and the article as well
@arthur-here did you update the code or article? I used defered
and coordinator won't show the view at all :) maybe I did it wrong!