Skip to content

Instantly share code, notes, and snippets.

@zafarivaev
Created January 14, 2020 14:54
Show Gist options
  • Select an option

  • Save zafarivaev/dd30c2a72ce34a2efeba9931ad65b31b to your computer and use it in GitHub Desktop.

Select an option

Save zafarivaev/dd30c2a72ce34a2efeba9931ad65b31b to your computer and use it in GitHub Desktop.
import RxSwift
open class ReactiveCoordinator<ResultType>: NSObject {
public typealias CoordinationResult = ResultType
public let disposeBag = DisposeBag()
private let identifier = UUID()
private var childCoordinators = [UUID: Any]()
private func store<T>(coordinator: ReactiveCoordinator<T>) {
childCoordinators[coordinator.identifier] = coordinator
}
private func release<T>(coordinator: ReactiveCoordinator<T>) {
childCoordinators[coordinator.identifier] = nil
}
@discardableResult
open func coordinate<T>(to coordinator: ReactiveCoordinator<T>) -> Observable<T> {
store(coordinator: coordinator)
return coordinator.start()
.do(onNext: { [weak self] _ in
self?.release(coordinator: coordinator) })
}
open func start() -> Observable<ResultType> {
fatalError("start() method must be implemented")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment