Coordinator-MVVM-Rx-Example icon indicating copy to clipboard operation
Coordinator-MVVM-Rx-Example copied to clipboard

Use Observable.defered in start method of coordinator.

Open sergdort opened this issue 6 years ago • 2 comments

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()

sergdort avatar Aug 04 '17 17:08 sergdort

Thanks @sergdort. That's such an awesome suggestion! I'm going to update the repository and the article as well

arthur-here avatar Aug 07 '17 06:08 arthur-here

@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!

mehdok avatar Jul 10 '18 12:07 mehdok