在RxSwift(1)源码分析-序列的创建及订阅)中我们提到了匿名可观察序列AnonymousObservable
的的继承关系,本文将从类或协议的角度,继续分析可观察序列和观察者的继承关系。
序列继承链
如下,这是我们创建Observable
所涉及到的继承关系。
1 | AnonymousObservable => Producer => Observable => ObservableType => ObservableConvertibleType |
由上至下,我们简单分析一下每一层。
协议 - ObservableConvertibleType
1 | public protocol ObservableConvertibleType { |
看注释可以明白,使用了关联类型提供了一个可转换为可观察序列Observable的方法,这个方法在遵守这个协议的类中实现即可。
这是最底层的协议,即可满足“万物皆序列”的目的。例如:
1 | UISwitch().rx.value.asObservable(); |
因为value是结构体ControlProperty类型的,而ControlProperty底层又遵守了ObservableConvertibleType协议,所以最后value可以被转换为一个可观察序列。
协议 - ObservableType
这是一个可观察序列协议,于是目前提供了一个每个可观察序列都一定会有的订阅方法subscribe
,只有外部订阅了该对象,才能真正实现对该对象进行观察。
1 | public protocol ObservableType: ObservableConvertibleType { |
类 - Observable
真正的类,可以称之为元类,对于用户来说Observable 的功能是完整的,因为它已经具备了所有的用户所需要的功能,尽管有些方法并没有得到实现仍是抽象方法。
1 | public class Observable<Element> : ObservableType { // Observable 可观察序列,所有序列的基类 |
上面注释写的很清楚了,主要是三个功能:
- 便于内存管理,实现了当Observable初始化和销毁的时候,分别实现Resources.incrementTotal()方法和Resources.decrementTotal()方法
- 实现了遵守的协议方法subscribe抽象方法,但是并没有具体实现,交给子类去实现
- 实现了协议方法asObservable(),使其子类调用这个方法都能返回一个可观察序列Observable
类 - Producer
Producer继承自Observable,主要是具体实现了父类的订阅方法subscribe
,并且提供了一个run
方法,但是并没有具体实现,交给子类去实现。
1 | class Producer<Element> : Observable<Element> { |
类 - AnonymousObservable
在创建序列的creat
方法中返回的就是这么个玩意儿,里面保存了创建序列的回调,其中的run
方法也会在序列的产生和订阅工程中使用到。
1 | final private class AnonymousObservable<Element>: Producer<Element> { |
订阅继承链
在订阅方法中,我们会创建一个AnonymousObserver
对象,并保存当前函数的参数闭包(EventHandler),下面我们至上而下分析AnonymousObserver
继承链的各个类。
1 | 类AnonymousObserver --> 类ObserverBase --> 协议Disposable,协议ObserverType |
协议 - ObserverType
主要是提供了一个所有订阅者都会有的事件处理on
方法。以及扩展的序列会出现的Next
,Completed
和Error
三种状态,只不过这里on
的方法是遵守这个协议的类的子类实现的on
方法。
1 | public protocol ObserverType { |
协议 - Disposable
提供了一个释放资源,即垃圾回收的方法。(这个后续详细分析其内部实现)
1 | public protocol Disposable { |
类 - ObserverBase
所有订阅者的基类.
- 提供了
onCore
方法,但是并没有具体实现,交给子类具体实现 - 实现on方法,根据序列状态
next
,error
,completed
,调用onCore
方法,并将事件传过去,交由子类具体实现 - 实现了垃圾回收的方法
1 | class ObserverBase<ElementType> : Disposable, ObserverType { |
类 - AnonymousObserver
- 在类初始化的时候,保存了_eventHandler对象
- 和Observable一样,分别实现Resources.incrementTotal()方法和Resources.decrementTotal()方法来管理内存
- 重写onCore方法
1 | final class AnonymousObserver<ElementType> : ObserverBase<ElementType> { |
总结
从RxSwift
的源码中可以很好的体现出swift
面向协议编程的思想,每个协议都有自己独有的方法,并且每个类可以遵循多个协议,很好的完成了功能拓展,更好的职责划分,更加模块化。
使用了AnonymousObservableSink
中间层来实现可观察序列AnonymousObservable
和订阅者AnonymousObserver
之间的通信。类似于其他框架中的manager
。
也可以在每个基类的初始化init和销毁方法中deinit实现监控内存管理的方法。