一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
上一篇我们分析了RxSwift的核心逻辑,本篇主要介绍RxSwift中观察者和序列的继承和遵循的协议。
1.Observable 可观察序列继承链
我们之前分析了序列的创建,订阅,发送信号。
//1.创建
let ob = Observable<Any>.create{ (obserber) -> Disposable in
//3.发送信号
obserber.onNext("hello")
obserber.onError(NSError.init(domain: "NetWorkError", code: 400, userInfo: nil))
//obserber.onCompleted()
return Disposables.create()
}
//2.订阅
ob.subscribe(onNext: { (value) in
print(value)
}, onError:{ (error) in
print(error)
} , onCompleted: {
print("订阅完成")
}, onDisposed: {
print("订阅销毁")
}).disposed(by: disposeBag)
大体上来说核心逻辑还是:创建序列,订阅序列,销毁序列。核心思想是万物皆可序列
我们看下Observable可观察序列,我们之前分析可知Observable<Any>.create中创建匿名序列AnonymousObservable,这个序列主要干2件事,一个就是保存初始化创建的_subscribeHandler闭包,重写run方法
- 我们继续查看
Producer
他是一个生产者,主要是通过对序列的订阅,关联观察者,销毁,同时线程管理。作为一个父亲的角色,赋予子类的这些能力,但是具体实现还是依靠子类自己实现。
比如这个run方法,就是定义一个抽象的方法,具体实现由子类去实现。
- 我们看到
Producer继续Observable
可以看到作为所有序列的基类,它提供了最简单的方法,通过init 和deinit来管理引用计数,类似我们ARC管理引用计数,公开实现协议的subscribe方法,asObservable()方法。关于asObservable()方法通过该方法可以把我们子类转换为Observable<Element>的类型,从而可以调用subscribe订阅功能,因为不断的定义子类,当前的类不再有 很简单,通过不断的分级颗粒度我们可以明确每一个类的职责和权限,使代码更加健壮。他们的关系类似于:子类->父类->基类。
- ObservableType
序列可以产生0个或多个元素,所以0个或多个' Next '事件可以发送给' observer '
一旦' Error '或' Completed '事件被发送,序列终止,不能产生任何其他元素。
事件可能从不同的线程发送,但不能同时发送两个事件到“观察者”。
主要就是定义了subscribe事件,同时拓展了asObservable()的默认实现方法。
- ObservableConvertibleType
ObservableType 同时遵循了ObservableConvertibleType协议,主要是提供了asObservable()方法。
对于序列我们可以得出他们的关系:
2. 订阅者Observer的继承链
我们之前分析了序列订阅的时候会创建AnonymousObserver匿名观察者,我们查看下AnonymousObserver
可以发现会保存初始化构造方法会保存eventHandler,也就是我们在外面定义的回调闭包。 重写onCore方法来实现eventHandler(event)回调,以及init和deinit处理引用计数。
- ObserverBase
对于基础观察者主要提供onCore方法供子类实现具体闭包回调,自身on方法则是调用自己的抽象接口onCore
- 协议
主要定义了on方法,同时定义了onNext,onCompleted,onError的实现通过on实现。
Disposable则主要定义了dispise()方法
- AnyObserver
对于我们的
AnonymousObserver匿名观察者我们通常并不想告诉外界,因此我们要转换为AnyObserver将操作转发给具有相同“Element”类型的任意底层观察者,隐藏底层观察者类型的细节。
保存我们AnonymousObserver中的on方法也就eventHandler闭包,通过on方法回调
我们可以看下它的关系图
-
3. Sink的继承链
对于Sink,我们可以把它理解为一个管理者,类似manager。持有observer观察者和obserbale序列,通过observer.on进行发送消息,收到消息后进行执行回调。我们看下序列AnonymousObservablerun中创建的
AnonymousObservableSink
可以发现在初始化的是实话保存了AnonymousObserver,通过run方法保存了序列AnonymousObservable也就是这个parent。
通过协议ObserverType的on方法进行事件回调
Sink
对于sink主要定义了on的转发方法,forwardOn 会调用遵循协议ObserverType的on方法。
4. 总结
通过再次梳理我们可以发现对于RxSwift,我们主要通过序列的创建,订阅和销毁(暂时没有介绍,后面会专门说明)。通过对observable序列和observer观察者的梳理可以发现,它的继承链和遵循的协议我们可以发现RxSwift框架设计的魅力,类功能的职责的明确,面向协议编程。Sink则是管理者序列和观察者,做到了响应式。