Nessuna descrizione

BaseCoordinator.swift 1.8KB

    // // 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.") } }