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
流程如下图: