RxCocoa中实现了许多UIKIt的分类。UIButton的touchUpInside点击方法被应用的场景多,于是RxSwift增加了tap方法,直接订阅UIButton的点击方法。
其实现也是对UIControl的扩展。
该过程会创建一个Observable(AnonymousObservable)对象和ControlEvent对象,Observable作为source被ControlEvent持有,返回的是ControlEvent对象。
ControlEvent被订阅时,创建AnonymousObsever对象,调用ControlEvent的subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable方法,实现中调用Observable的subscribe方法,然后创建AnonymousObservableSink,最终调用AnonymousObservable的_subscribeHandler,即下面代码块,通过controlTarget实现事件绑定。
{ [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) }