【问题标题】:RxSwift + MVVM + Coordinator Pattern, How to wait for coordinator result sequentially?RxSwift + MVVM + Coordinator Pattern,如何顺序等待协调器结果?
【发布时间】:2018-03-20 10:14:26
【问题描述】:

场景:

我有基本的协调员,基本上是这样的:

class Coordinator<Result> {
   // some coordinator class codes

   func coordinate(to: Coordinator<T>) -> Observable<T> {
       return coordinator.start()
   }

   func start() -> Observable<Result> {
      // return result
   }
} 

和 TestCoodinator1, TestCoordinator2, TestCoodinator3 像这样:

enum Status {
    case .success(data: NSData?)
    case .cancelled(error: NSError?)
    case .failed(data: NSData?)
}

class TestCoordinator1: Coordinator<Status> {
     // Init pass UINavigationController as rootViewController

     let testVC1 = TestViewController1()
     let testVM1 = TestViewModel1()
     testVC1.viewModel = testVM1         

     return testVM1.status // returns Observable<Status>
         .do(onNext: { [unowned self] _ in self?.rootViewController.popViewController(animated: true)
} 

我的主要协调员基本上是这样的:

class MainCoordinator: Coordinator<Void> {

    override func start() -> Observable<Void> {
        let mainVC = MainVC()
        let mainVM = MainVM()
        mainVC.viewModel = mainVM

        let testCoordinator1 = TestCoordinator1(in: rootViewController)
        let viewModel1 = ViewModel1()
        testCoordinator1.viewModel = viewModel1

        let testCoordinator2 = TestCoordinator2(in: rootViewController)
        let viewModel2 = ViewModel2()
        testCoordinator2.viewModel = viewModel2

        let testCoordinator3 = TestCoordinator3(in: rootViewController)
        let viewModel3 = ViewModel3()
        testCoordinator3.viewModel = viewModel3

        // viewModel.tests returns Observable that has three types of tests randomly generated
        // Observable.of("Test1", "Test2", "Test3")
        mainVM.tests ????

        return Observable.never()
    }
}

问题:

如何创建与 test1 坐标并等待 test1 完成的 observable,然后对结果进行一些处理,然后才运行 test2,处理一些结果,然后运行 ​​test3。

如果我这样做:

mainVM.tests
   .flatMap { test in 
       switch(test) {
           case "Test1":
                 return self.coordinate(to: testCoordinator1)
           case "Test2":
                 return self.coordinate(to: testCoordinator2)
           case "Test3":
                 return self.coordinate(to: testCoordinator3)
       }
   }
   .subscribe(onNext: { status in 
      self.processStatus(status)
   })

三个协调器同时运行

【问题讨论】:

    标签: swift mvvm reactivex


    【解决方案1】:

    如果我理解正确,您可以通过chaining observables 实现:

    mainVM.tests
        .flatMapLatest { test -> Observable<...> in
            // do some things
            return self.coordinate(to: testCoordinator1)
        }
        .flatMapLatest { _ -> Observable<...> in
            // handle first coordinator
            return self.coordinate(to: testCoordinator2)
        }
        .flatMapLatest { _ -> Observable<...> in
            // handle second coordinator
            return self.coordinate(to: testCoordinator3)
        }
        .flatMapLatest { _ -> Observable<...> in
            // handle third coordinator
        }
        .subscribe(onNext: { status in
            self.processStatus(status)
        })
    

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 2019-10-08
      • 2021-05-13
      • 2018-09-16
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 2016-05-24
      相关资源
      最近更新 更多