|
//
// BaseCoordinator.swift
// Paiai_iOS
//
// Created by FFIB on 2019/4/29.
// Copyright © 2019 FFIB. All rights reserved.
//
import RxSwift
import UIKit
public class BaseCoordinator<ResultType> {
typealias CoordinationResult = ResultType
let disposeBag = DisposeBag()
var didCancel = PublishSubject<Void>()
var deallocatedDispose = Disposables.create()
var navigationController: UINavigationController
var viewController: UIViewController
private let identifier = UUID()
private var childCoordinators = [UUID: Any]()
var parentCoordinator: (Any)? = nil
init(navigationController: UINavigationController, viewController: UIViewController) {
self.viewController = viewController
self.navigationController = navigationController
deallocatedDispose = viewController.rx.viewDidDisappear.subscribe(onNext: {[weak self] _ in
guard let `self` = self else { return }
if !self.navigationController.viewControllers.contains(viewController) {
self.didCancel.onNext(())
}
})
}
private func store<T>(coordinator: BaseCoordinator<T>) {
childCoordinators[coordinator.identifier] = coordinator
}
private func free<T>(coordinator: BaseCoordinator<T>) {
print(coordinator)
childCoordinators[coordinator.identifier] = nil
}
func coordinate<T>(to coordinator: BaseCoordinator<T>) -> Observable<T> {
store(coordinator: coordinator)
coordinator.parentCoordinator = self
return coordinator.start()
.do(onNext: { [weak self] _ in
self?.free(coordinator: coordinator)
})
}
func start() -> Observable<ResultType> {
fatalError("Start method should be implemented.")
}
}
|