前言
RxSwift是一个基于响应式编程的Swift框架,它提供了一种简练而强壮的办法来处理异步和事情驱动的编程任务。在RxSwift中,中心流程包含调查者、可调查序列和订阅。
RxSwift中心流程三部曲
// 1.创立序列
_ = Observable<String>.create { ob in
// 3.发送信号
ob.onNext("你好")
return Disposables.create()
// 2.订阅序列
}.subscribe(onNext: { text in
print("订阅到了\(text)")
})
}
- 1.创立序列
- 2.订阅序列
- 3.发送信号
上面三部曲的履行成果:

RxSwift比较好奇为什么会打印订阅到了你好,分明是两个闭包里边的代码。
咱们先简略剖析下:
- 序列创立
create后面带了闭包A,闭包A里边履行了发送信号的流程 - 订阅
subsribe后面带了闭包B - 依据成果咱们知道一定是先履行了
闭包A,再把闭包A的你好传给了闭包B,然后输出成果
RxSwift中心逻辑剖析
创立序列

点进create函数能够看到它是拓宽了ObservableType这个协议,同时创立了一个AnonymousObservable内部类(看姓名是匿名序列,具有一些通用的特性)剖析AnonymousObservable的承继链能够得到下面的联系图:

AnonymousObservable

AnonymousObservable是承受Element泛型的承继自Producer的类,他承受并保存一个闭包subscribeHandler的参数,这个其实便是上面咱们说的闭包A,别的有一个run函数(后面会提到)
Producer

Producer是承受Element泛型的承继自Observable的类,有一个subscribe的完成,run的笼统办法,这个subscribe非常重要
Observable

Observable是承受Element泛型的完成ObservableType协议的类,有一个subscribe的笼统办法,asObservable的完成(回来self,一致万物皆序列)
同时Observable有统计引证计数的才能(Resources这个结构体在序列,调查者,毁掉者等都用到,能够调试是否有内存走漏),其中的AtomicInt是一把NSLock的锁,保证数据的存取安全

ObservableType

ObservableType是拓宽ObservableConvertibleType协议的协议,界说了subscribe协议办法,完成了asObservable()办法,所以这儿咱们得出结论,不一定要承继Observable的才是序列,只要是完成了ObservableType的subscribe的协议办法的也能够算是序列,进一步佐证万物接序列
ObservableConvertibleType

ObservableConvertibleType是个协议,相关了Element类型,界说asObservable的协议办法
订阅序列
点击subscribe函数

它是ObservableType的拓宽才能,创立了一个AnonymousObserver(匿名调查者)
,承受的Element仔细查看承继链代码会发现跟序列创立的泛型是同一个
剖析AnonymousObserver的承继链咱们能够得到下图:

AnonymousObserver

AnonymousObserver是承受Element泛型的承继自ObserverBase的类
保存了一个eventHandler的闭包,这个咱们界说是闭包C
同时也有统计引证计数的才能,有一个onCore的完成
ObserverBase

ObserverBase是承受Element泛型的完成Disposable和ObserverType两个协议的类,有一个on的完成,onCore的笼统办法
ObserverType

ObserverType相关了Element,界说了on的协议办法,拓宽界说了onNext,onCompleted,onError的办法,这三个办法其实都是on一个Event
其中Event是个枚举,有三类事情:next事情、error事情和completed事情。
-
next事情:next事情携带了一个值,表明数据的更新或新的事情。 -
error事情:error事情表明发生了一个错误,中止了事情的正常流程。 -
completed事情:completed事情表明事情流的结束,不再有新的事情产生。 调查者经过订阅可调查序列来接收事情。
Disposable

Disposable这个协议比较简略,界说了dispose办法
订阅流程剖析
-
1.调用
self.asObservable().subscribe(observer)- 这个
self是AnonymousObservable的实例 - 调用
asObservable办法经过承继链最终调用Observable的完成,回来self,也就还是AnonymousObservable的实例
- 这个
-
2.调用
AnonymousObservable的实例的subscribe办法,经过承继链调用Producer的subscribe办法

- 3.
Producer的run办法在AnonymousObservable有完成

sink的处理是适当不错的,很好的做到了事务下沉,同时很好的运用了中间件和单一责任的规划模式,值得学习。
sink是管道的意思,下水道,什么东西都会往里边丢,这儿面有订阅者,毁掉者等
-
sink.run
-
-
parent.subscribeHandler(AnyObserver(self))这儿的parent便是AnonymousObservable的实例,调用subscribeHandler这个也便是咱们界说的闭包A这儿解说了订阅的时候会来到咱们的闭包A的原因。 这儿需求注意到AnyObserver这个类,他里边保存的observer特点其实是AnonymousObservableSink.on函数
-
发送信号
有了上两步的基础咱们剖析发送信号的流程应该比较明晰了
-
-
obserber.onNext其实便是AnyObserver.onNext
-
-
-
ObserverType.onNext其实便是ObserverType.on
-
-
- 其实便是
AnyObserver.on
- 其实便是

- 4.这个
observer便是上面第二步最后的AnonymousObservableSink.on函数

- 5.父类
Sink.forwardOn函数

self.observer类型是 AnonymousObserver
- 6.调用
AnonymousObserver的父类ObserverBase的on办法

- 7.调用
AnonymousObserver的onCore办法

- 8.调用
eventHandler,也便是咱们界说的闭包C - 9.
闭包C依据Event调用闭包B,闭包B输出了控制台的成果,至此,整个链路履行结束了。

把整个中心流程用思想导图描绘出来:

总结
-
万物皆序列,序列的概念一致了编码 - 完好的承继链做到了
事务分离,单一责任 -
中间价模式很好的做到了事务下沉
