RxSwift Scheduler调度环境
调度环境的初探
DispatchQueue.global().async {
self.button.rx.tap.subscribe(onNext: { () in
print("订阅回调线程 \(Thread.current)") // 主线程
}).disposed(by: self.disposeBag)
}
上面按钮的点击事件回调线程为主线程,这一过程是如何实现的呢?明明是在子线程中订阅的。且看源码分析。
高清无码Xmind下载地址
public var tap: ControlEvent<Void> {
return controlEvent(.touchUpInside)
}
public func controlEvent(_ controlEvents: UIControl.Event) -> ControlEvent<()> {
let source: Observable<Void> = Observable.create { [weak control = self.base] observer in
MainScheduler.ensureRunningOnMainThread()
guard let control = control else {
observer.on(.completed)
return Disposables.create()
}
let controlTarget = ControlTarget(control: control, controlEvents: controlEvents) { _ in
observer.on(.next(()))
}
return Disposables.create(with: controlTarget.dispose)
}
.takeUntil(deallocated)
return ControlEvent(events: source)
}
1、self.button.rx.tap创建了一个序列返回的是ControlEvent结构体,它实现了ControlEventType协议,而ControlEventType又实现了ObservableType协议。在controlEvent方法中并没有对线程进行过操作
2、而MainScheduler.ensureRunningOnMainThread()只是判断当前执行的是否是主线程
3、下面来看ControlEvent的初始化方法
public init<Ev: ObservableType>(events: Ev) where Ev.Element == Element {
self._events = events.subscribeOn(ConcurrentMainScheduler.instance)
}
由源码可知,唯一有线程操作的地方是ConcurrentMainScheduler.instance
private init(mainScheduler: MainScheduler) {
self._mainQueue = DispatchQueue.main
self._mainScheduler = mainScheduler
}
public static let instance = ConcurrentMainScheduler(mainScheduler: MainScheduler.instance)
在ConcurrentMainScheduler初始化方法中默认创建了一个主队列
4、这里events = source, 由controlEvent方法中创建传递过来的,events.subscribeOn()就决定了订阅在主线程中了。