同OC
的RAC
,RxSwift是一个针对于Swift
版本的响应式编程框架。经过对官网和一些源码的阅读,决定做一些总结,方便以后知其所以然。
在RxSwift的使用中,我们需要先创建序列,然后订阅信号、发送信号来实现一个完整的流程。这边文章便针对这一流程进行简单解读和总结。
代码示例
附上使用代码,可见有三大流程
1 | 1.创建序列 => 2.订阅信号 => 3.发送信号。 |
1 | // 1:创建序列 |
分析以上代码,我们得知2中闭包的执行是依赖1中闭包的执行的,但是1中闭包何时执行就不得而知,接着我们便挨着分析每个流程的源码。
分析Creat函数
首先来看Creat
的定义函数。可知可观察序列
的创建是利用协议拓展功能的creat
方法实现,返回了一个AnonymousObservable
(匿名可观察序列)。
1 | //creat.swift文件中。 |
进入到AnonymousObservable
这个类中,如下可知:其内部用self._subscribeHandler = subscribeHandler
这样一句代码来保存创建函数的闭包A。
1 | //AnonymousObservable就是一个内部类,具备一些通用特性 |
关于AnonymousObservable
的继承关系如下:
1 | AnonymousObservable => Producer => Observable => ObservableType => ObservableConvertibleType |
分析Subscribe函数
通过以下函数可知,函数中创建了一个AnonymousObserver
的对象。最后调用了self.asObservable().subscribe(observer)
,通过subscribe
函数把创建好的AnonymousObserver
传递到AnonymousObservable
这个类中。相当于调用了闭包A,并完成了传值。
1 | //ObservableType+Extensions 中 |
AnonymousObserver
是匿名观察者,用于存储和处理事件的闭包。定义如下:
可知这里用_eventHandler
保存了外面传入的事件闭包。
1 | final class AnonymousObserver<Element>: ObserverBase<Element> { |
关于self.subscribe(observer)
传值,其实是通过可观察序列的继承关系,通过Producer
中方法的具体实现来完成相应效果。
1 | //Producer类中 |
可知:self.run
这个代码最终由我们生产者 Producer
延伸到我们具体的事务代码 AnonymousObservable.run
,并将Observer
对象传过来, 定义如下。
这里通过使用AnonymousObservableSink
的中间对象,将可观察者Observable和观察者Observer链接起来,实现事件的传递,起到一个桥梁的作用。
1 | override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { |
sink.run
的执行可追溯到AnonymousObservableSink
中:
1 | //parent指传过来的AnonymousObservable对象 |
AnyObserver(self)
: 把AnonymousObservableSink
对象转换成AnyObserver
对象。
看AnyObserver
源码如下:
1 | public struct AnyObserver<Element> : ObserverType { |
事件的发送
在AnonymousObservableSink
中,关于on
方法的定义:
1 | // AnonymousObservableSink类on方法 |
self.forwardOn(event)
,进入到Sink
中的forwardOn
方法。
1 | final func forwardOn(_ event: Event<O.E>) { |
这里的_observer
就是第二步调用subscribe
函数里面创建的observer对象。
会先进入到父类的ObserverBase
的on
方法
1 | func on(_ event: Event<E>) { |
1 | override func onCore(_ event: Event<Element>) { |
这里的_eventHandler
闭包就是第二步调用subscribe
函数传入的闭包。
总结
至此,大概流程已解读完毕,用一张图来总结下。