swift - RxSwift + MVVM + 协调器模式,如何顺序等待协调器结果?

标签 swift mvvm reactivex

场景:

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

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 的 observable 并首先等待 test1 完成,然后对结果进行一些处理,然后 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)
   })

所有三个协调器同时运行

最佳答案

如果我没理解错的话,你可以通过 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)
    })

关于swift - RxSwift + MVVM + 协调器模式,如何顺序等待协调器结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49381467/

相关文章:

asp.net - 多个独立 View 模型交互( knockout )

wpf - 在复杂、解耦的 WPF 应用程序上使用 Expression Blend 的策略是什么?

javascript - Rxjs 合并()不工作

rxjs - 使用flatMap将数组转换为项目序列

ios - 将字符串添加到另一个字符串的开头

ios - 用另一个 CALayer 屏蔽 CALayer

c# - MVVM ViewModel 将参数传递给另一个 ViewModel

arrays - 如何快速比较和显示 TableView 中numberOfRowsInSection中的不同数组计数

ios - 如果语句仍然执行则为假

javascript - 在 RxJS 中实现 for-await-of 语句