[英]RxSwift + MVVM + Coordinator Pattern, How to wait for coordinator result sequentially?
场景:
我有基本的协调员,基本上像这样:
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完成,然后对结果进行一些处理,然后才运行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)
})
所有三个协调员同时运行
如果我对您的理解正确,则可以通过链接可观察对象来实现:
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)
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.