Observable
承继链
Observable
可调查序列这一条的承继链大体如下
别的还有Observer
这一条的承继链
AnonymousObservableSink
承接上文Observable
的源码剖析段处,其实当时只剖析到了在通过AnonymousObservableSink
目标调用run
函数后成功调用到了外部的回调函数并在其间发送事情,发送事情成功被外部subscribe
的回调函数捕捉到进行了打印,可是其间触及的原理并未剖析,本文此处将对这部分内容进行剖析
之前说道就是从这儿调用了外部的回调,也就是调用了
在外部回调中的observer
也就是上图中的AnyObserver(self)
,这儿的self
即指AnonymousObservableSink
AnonymousObservableSink
的初始化就在下图这儿,一起在这儿能够看到AnonymousObservableSink
也就是这个管道目标其间不光保存了observer(订阅者)
、dispose(销毁者)
还在其run
函数中将AnonymousObservable(可调查队列)
作为参数传入,也就是说管道目标一起拥有订阅者
、销毁者
、队列
在回调到外部时的observer
是一个结构体并调用这儿标识的初始化办法
这儿注意self.observer = observer.on
observer.on
就是指AnonymousObservableSink
管道这儿的on
函数
也就是说AnyObserver.observer
保存的就是AnonymousObservableSink
的on
函数
那么在外部回调中调用的observer.onNext("12345")
会先调用到ObserverType
协议扩展中的办法
之后便会调用到AnyObserver
中的on
函数
最终会调用到AnonymousObservableSink
的on
函数,这是在AnyObserver
初始化的时候便保存了的
之后就是调用到了父类Sink
中的forwardOn
办法
之前说过管道目标有将内部的匿名订阅者(AnonymousObserver
)保存起来,一致的逻辑都在这儿处理,中心的onCore
办法则是由自己来完成并调用到这儿
所以会调用到AnonymousObserver
的onCore
办法
最终又调用到了AnonymousObserver
创立时的跟随闭包这儿
最终由这儿来依据事情的类型来调用外部不同的回调
完好的流程由图表示:
至此结合上文中对Observable
的中心逻辑剖析完成
定时器(Timer)
往常咱们使用的定时器大概有以下三种:
NSTimer
GCD
CADiplayLink
其间NSTimer
和CADiplayLink
都要依靠于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)
Timer
承继于Producer
就是一个可调查的序列,将传入的三个信息进行保存
接下来开端订阅subscribe
,这个subscribe
是调用到了ObservableType
的subscribe
创立一个AnonymousObserver
内部订阅者, 通过asObservable()
后的subscribe
正是调用了Producer
中的subscribe
,与之前剖析的就是相同
之后同样先去调用子类的run
办法,这儿也就是Timer
的run
仍是创立一个将订阅者、序列、销毁者都包括的管道目标,一起走到TimerSink
的run
办法
接下来会调用到SerialDispatchQueueScheduler
中的schedulePeriodic
,因为外部传入的参数就是MainScheduler.instance
,而MainScheduler
承继于SerialDispatchQueueScheduler
,且schedulePeriodic
办法只在SerialDispatchQueueScheduler
完成了
最终调用到DispatchQueueConfiguration
中的schedulePeriodic
一目了然,在其内部仍是封装了GCD
来完成的定时器,其间定时器每次调用这儿向外部传递信息
这个action
就是在TimerSink
中run
办法内的一个闭包
也就是说内部定时器每次触发的事情都会来调用forwardOn
,那么会调用到Sink
的forwardOn
又会调用到ObserverBase
中的on
函数
详细的onCore
就是来自于AnonymousObserver
最后则是由这儿调用到最外部的subscribe
的闭包
其实大体流程和之前剖析的Observable
中心流程基本相同
RxSwift
中Timer
流程如下图: