前言
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
的协议办法
订阅序列
点击subscrib
e函数
它是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
输出了控制台的成果,至此,整个链路履行结束了。
把整个中心流程用思想导图
描绘出来:
总结
-
万物皆序列
,序列的概念一致了编码 - 完好的承继链做到了
事务分离
,单一责任
-
中间价
模式很好的做到了事务下沉