同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函数传入的闭包。
总结
至此,大概流程已解读完毕,用一张图来总结下。
