RxSwift源码札记-3:Button.tap流程

490 阅读1分钟

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) }