RxSwit学习-03- 核心继承链

2,857 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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方法

image.png

  • 我们继续查看Producer

image.png

他是一个生产者,主要是通过对序列的订阅关联观察者销毁同时线程管理。作为一个父亲的角色,赋予子类的这些能力,但是具体实现还是依靠子类自己实现。

image.png

比如这个run方法,就是定义一个抽象的方法,具体实现由子类去实现。

  • 我们看到Producer继续Observable

image.png

可以看到作为所有序列的基类,它提供了最简单的方法,通过init 和deinit来管理引用计数,类似我们ARC管理引用计数,公开实现协议的subscribe方法,asObservable()方法。关于asObservable()方法通过该方法可以把我们子类转换为Observable<Element>的类型,从而可以调用subscribe订阅功能,因为不断的定义子类,当前的类不再有 很简单,通过不断的分级颗粒度我们可以明确每一个类的职责和权限,使代码更加健壮。他们的关系类似于:子类->父类->基类

  • ObservableType

image.png

序列可以产生0个或多个元素,所以0个或多个' Next '事件可以发送给' observer ' 一旦' Error '或' Completed '事件被发送,序列终止,不能产生任何其他元素。 事件可能从不同的线程发送,但不能同时发送两个事件到“观察者”。
主要就是定义了subscribe事件,同时拓展了asObservable()的默认实现方法。

  • ObservableConvertibleType

image.png

ObservableType 同时遵循了ObservableConvertibleType协议,主要是提供了asObservable()方法。

对于序列我们可以得出他们的关系:

未命名文件-2.jpg

2. 订阅者Observer的继承链

我们之前分析了序列订阅的时候会创建AnonymousObserver匿名观察者,我们查看下AnonymousObserver

image.png

可以发现会保存初始化构造方法会保存eventHandler,也就是我们在外面定义的回调闭包。 重写onCore方法来实现eventHandler(event)回调,以及initdeinit处理引用计数。

  • ObserverBase

image.png

对于基础观察者主要提供onCore方法供子类实现具体闭包回调,自身on方法则是调用自己的抽象接口onCore

  • 协议

image.png

主要定义了on方法,同时定义了onNext,onCompleted,onError的实现通过on实现。

image.png

Disposable则主要定义了dispise()方法

  • AnyObserver 对于我们的AnonymousObserver匿名观察者我们通常并不想告诉外界,因此我们要转换为AnyObserver将操作转发给具有相同“Element”类型的任意底层观察者,隐藏底层观察者类型的细节。

image.png

保存我们AnonymousObserver中的on方法也就eventHandler闭包,通过on方法回调

我们可以看下它的关系图

-observer-2.jpg

3. Sink的继承链

对于Sink,我们可以把它理解为一个管理者,类似manager。持有observer观察者和obserbale序列,通过observer.on进行发送消息,收到消息后进行执行回调。我们看下序列AnonymousObservablerun中创建的

  • AnonymousObservableSink

image.png

可以发现在初始化的是实话保存了AnonymousObserver,通过run方法保存了序列AnonymousObservable也就是这个parent

通过协议ObserverType的on方法进行事件回调

  • Sink

image.png

对于sink主要定义了on的转发方法,forwardOn 会调用遵循协议ObserverType的on方法。

未命名文件-4.jpg

4. 总结

通过再次梳理我们可以发现对于RxSwift,我们主要通过序列的创建订阅销毁(暂时没有介绍,后面会专门说明)。通过对observable序列observer观察者的梳理可以发现,它的继承链和遵循的协议我们可以发现RxSwift框架设计的魅力,类功能的职责的明确,面向协议编程。Sink则是管理者序列和观察者,做到了响应式