Observable

承继链

Observable可调查序列这一条的承继链大体如下

RxSwift-Observable补充&&Timer

别的还有Observer这一条的承继链

RxSwift-Observable补充&&Timer

AnonymousObservableSink

承接上文Observable源码剖析段处,其实当时只剖析到了在通过AnonymousObservableSink目标调用run函数后成功调用到了外部的回调函数并在其间发送事情,发送事情成功被外部subscribe的回调函数捕捉到进行了打印,可是其间触及的原理并未剖析,本文此处将对这部分内容进行剖析

RxSwift-Observable补充&&Timer
之前说道就是从这儿调用了外部的回调,也就是调用了

RxSwift-Observable补充&&Timer

在外部回调中的observer也就是上图中的AnyObserver(self),这儿的self即指AnonymousObservableSink

AnonymousObservableSink初始化就在下图这儿,一起在这儿能够看到AnonymousObservableSink也就是这个管道目标其间不光保存了observer(订阅者)dispose(销毁者)还在其run函数中将AnonymousObservable(可调查队列)作为参数传入,也就是说管道目标一起拥有订阅者销毁者队列

RxSwift-Observable补充&&Timer

在回调到外部时的observer是一个结构体并调用这儿标识的初始化办法

RxSwift-Observable补充&&Timer

这儿注意self.observer = observer.on

observer.on就是指AnonymousObservableSink管道这儿的on函数

RxSwift-Observable补充&&Timer

也就是说AnyObserver.observer保存的就是AnonymousObservableSinkon函数

RxSwift-Observable补充&&Timer

那么在外部回调中调用的observer.onNext("12345")会先调用到ObserverType协议扩展中的办法

RxSwift-Observable补充&&Timer

之后便会调用到AnyObserver中的on函数

RxSwift-Observable补充&&Timer

最终会调用到AnonymousObservableSinkon函数,这是在AnyObserver初始化的时候便保存了的

RxSwift-Observable补充&&Timer

之后就是调用到了父类Sink中的forwardOn办法

RxSwift-Observable补充&&Timer

之前说过管道目标有将内部的匿名订阅者(AnonymousObserver)保存起来,一致的逻辑都在这儿处理,中心的onCore办法则是由自己来完成并调用到这儿

RxSwift-Observable补充&&Timer

所以会调用到AnonymousObserveronCore办法

RxSwift-Observable补充&&Timer

最终又调用到了AnonymousObserver创立时的跟随闭包这儿

RxSwift-Observable补充&&Timer

最终由这儿来依据事情的类型来调用外部不同的回调

RxSwift-Observable补充&&Timer

完好的流程由图表示:

RxSwift-Observable补充&&Timer

RxSwift-Observable补充&&Timer

至此结合上文中对Observable的中心逻辑剖析完成

定时器(Timer)

往常咱们使用的定时器大概有以下三种:

  • NSTimer
  • GCD
  • CADiplayLink

其间NSTimerCADiplayLink都要依靠于NSRunLoop仅有GCD并不依靠NSRunLoop,接下来先温顾以下这些定时器的用法

NSTimer

Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
    print("123")
}

CADiplayLink

cadTimer = CADisplayLink.init(target: self, selector: #selector(timerFire))
cadTimer?.preferredFramesPerSecond = 1
cadTimer?.add(to: .current, forMode: .common)

GCD

gcdTimer = DispatchSource.makeTimerSource()
gcdTimer?.schedule(deadline: .now(), repeating: .seconds(1))
gcdTimer?.setEventHandler(handler: {
    print("GCD Timer")
})
gcdTimer?.resume()

RxSwift中也有定时器,现在来探究一下这儿的定时器底层是封装了什么来完成的

Observable<Int>.timer(.seconds(1), period: .seconds(1), scheduler: MainScheduler.instance).subscribe { event in
    print(event)
}.disposed(by: disposeBag)

首先初始化一个Timer的目标,其间包含了三个信息:

  • 多久发射第一个事情(dueTime)
  • 每次事情宣布的间隔时间(period)
  • 调度者(scheduler)

RxSwift-Observable补充&&Timer

Timer承继于Producer就是一个可调查的序列,将传入的三个信息进行保存

RxSwift-Observable补充&&Timer

接下来开端订阅subscribe,这个subscribe是调用到了ObservableTypesubscribe

RxSwift-Observable补充&&Timer

创立一个AnonymousObserver内部订阅者, 通过asObservable()后的subscribe正是调用了Producer中的subscribe,与之前剖析的就是相同

RxSwift-Observable补充&&Timer

之后同样先去调用子类的run办法,这儿也就是Timerrun

RxSwift-Observable补充&&Timer

仍是创立一个将订阅者、序列、销毁者都包括的管道目标,一起走到TimerSinkrun办法

RxSwift-Observable补充&&Timer

接下来会调用到SerialDispatchQueueScheduler中的schedulePeriodic,因为外部传入的参数就是MainScheduler.instance,而MainScheduler承继于SerialDispatchQueueScheduler,且schedulePeriodic办法只在SerialDispatchQueueScheduler完成了

RxSwift-Observable补充&&Timer

最终调用到DispatchQueueConfiguration中的schedulePeriodic

RxSwift-Observable补充&&Timer

一目了然,在其内部仍是封装了GCD来完成的定时器,其间定时器每次调用这儿向外部传递信息

RxSwift-Observable补充&&Timer

这个action就是在TimerSinkrun办法内的一个闭包

RxSwift-Observable补充&&Timer

也就是说内部定时器每次触发的事情都会来调用forwardOn,那么会调用到SinkforwardOn

RxSwift-Observable补充&&Timer

又会调用到ObserverBase中的on函数

RxSwift-Observable补充&&Timer

详细的onCore就是来自于AnonymousObserver

RxSwift-Observable补充&&Timer

最后则是由这儿调用到最外部的subscribe的闭包

RxSwift-Observable补充&&Timer

RxSwift-Observable补充&&Timer

其实大体流程和之前剖析的Observable中心流程基本相同

RxSwiftTimer流程如下图:

RxSwift-Observable补充&&Timer