[英]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.