一起养成写作习惯!这是我参与「掘金日新计划 · 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
则是管理者序列和观察者,做到了响应式
。