就問此時此刻還有誰伐割?45度仰望天空妥箕,該死连躏!我這無處安放的魅力萨惑!
- RxSwift(1)—— 初探
- RxSwift(2)—— 核心邏輯源碼分析
- RxSwift(3)—— Observable序列的創(chuàng)建方式
- RxSwift(4)—— 高階函數(上)
- RxSwift(5)—— 高階函數(下)
- RxSwift(6)—— scheduler源碼解析(上)
- RxSwift(7)—— scheduler源碼解析(下)
- RxSwift(8)—— KVO底層探索(上)
- RxSwift(9)—— KVO底層探索(下)
- RxSwift(10)—— 場景序列總結
- RxSwift(11)—— 銷毀者-dispose源碼解析
- RxSwift(12)—— Subject即攻也守
- RxSwift(13)—— 爬過的坑
- RxSwift(14)—— MVVM雙向綁定
RxSwift目錄直通車--- 和諧學習捐康,不急不躁!
作為ReactiveX家族之一的RxSwift在
Github
截止現在Star:16K
.為什么這個框架如此受歡迎庸蔼,作為函數響應式框架典型代表吹由,底層實現又是如何實現的呢?這一篇文章全面解密
RxSwift核心流程
RxSwift
這個優(yōu)秀的框架朱嘴,設計的api
也是非常精簡倾鲫,讓陌生的用戶也能非常快速上手
- 1: 創(chuàng)建序列
- 2: 訂閱序列
- 3:發(fā)送信號
// 1: 創(chuàng)建序列
_ = Observable<String>.create { (obserber) -> Disposable in
// 3:發(fā)送信號
obserber.onNext("Cooci - 框架班級")
return Disposables.create() // 這個銷毀不影響我們這次的解讀
// 2: 訂閱序列
}.subscribe(onNext: { (text) in
print("訂閱到:\(text)")
})
// 控制臺打悠兼摇:“訂閱到:Cooci - 框架班級”
我剛開始在探索的時候乌昔,我是比較好奇的:為什么我們的Cooci - 框架班級
這個字符串會在訂閱序列的subscribe
的閉包打印。下面是我的代碼分析
分析代碼:
- 1:創(chuàng)建序列的代碼
Create
后面的閉包A
里面有3:發(fā)送信號
壤追,如果要執(zhí)行發(fā)送信號
磕道,必然要來到這個閉包A
- 2:我們執(zhí)行
2: 訂閱序列
創(chuàng)建了閉包B
- 3:通過結果我們顯然知道,先執(zhí)行
閉包A
把Cooci - 框架班級
傳給了閉包B
- 猜測:代碼里面嵌套了閉包的執(zhí)行調用行冰!猜測的真實性溺蕉,我們開始解讀源碼來驗證
PS: 說實話
RxSwift
框架的源碼的確比較復雜并且很多伶丐,很多基礎薄弱或者耐性不夠的小伙伴很容易放棄。但是你看到這篇博客疯特,你有福了:我會快速簡短給你介紹哗魂,在最后面會附上我繪制的思維導圖!
RxSwift核心邏輯
創(chuàng)建序列
extension ObservableType {
// MARK: create
public static func create(_ subscribe: @escaping (AnyObserver<E>) -> Disposable) -> Observable<E> {
return AnonymousObservable(subscribe)
}
}
大家可以很清晰看到我們的 可觀察序列
的創(chuàng)建是利用協(xié)議拓展功能的create方法實現的漓雅,里面創(chuàng)建了一個 AnonymousObservable(匿名可觀察序列)
命名還是體現了作者的思維 :這個類就是一個內部類录别,具備一些通用特性(具有自己功能的類才會命名) 下面我貼出這個類的繼承關系
從上面的圖,我們可以清晰的看到的繼承關系邻吞。那么這么多的內容還有那么多層嵌套组题,這個地方我們需要掌握什么:
-
create
方法的時候創(chuàng)建了一個內部對象AnonymousObservable
-
AnonymousObservable
保存了外界的閉包 -
AnonymousObservable
繼承了Producer
具有非常重要的方法subscribe
訂閱序列
這里說明這個訂閱方法 subscribe
和我們上面所說的 subscribe
不是同一個方法
來自于對 ObservableType
的拓展功能
extension ObservableType {
public func subscribe(onNext: ((E) -> Void)? = nil, ...) -> Disposable {
// 因為篇幅 省略不影響我們探索的代碼
let observer = AnonymousObserver<E> { event in
switch event {
case .next(let value):
onNext?(value)
case .error(let error):
if let onError = onError {
onError(error)
}
else {
Hooks.defaultErrorHandler(callStack, error)
}
disposable.dispose()
case .completed:
onCompleted?()
disposable.dispose()
}
}
return Disposables.create(
self.asObservable().subscribe(observer),
disposable
)
}
}
代碼說明:
-
E
這里的意思是Swift
的關聯類型,這個如果仔細看過可觀察序列的繼承鏈源碼應該不難得出:這個E
就是我們的 序列類型抱冷,我們這里就是String
public class Observable<Element> : ObservableType {
/// Type of elements in sequence.
public typealias E = Element
- 創(chuàng)建了一個
AnonymousObserver (匿名內部觀察者)
手法和我們的AnonymousObservable
差不多崔列,它這里的初始化是閉包參數,保存了外界的onNext, onError , onCompleted , onDisposed
的處理回調閉包的調用,下面我還是給大家貼出觀察者
的繼承鏈關系旺遮,幫助大家理解
-
self.asObservable()
這個是我們的RxSwift
為了保持一致性的寫法 -
self.asObservable().subscribe(observer)
其實本質就是self.subscribe(observer)
,通過可觀察序列的繼承關系峻呕,我們可以非常快速的定位Producer
訂閱代碼
override func subscribe(_ observer: O) -> Disposable where O.E == Element {
if !CurrentThreadScheduler.isScheduleRequired {
// 篇幅原因趣效,我們省略一些代碼,方便我們理解
...
return disposer
}
else {
return CurrentThreadScheduler.instance.schedule(()) { _ in
let disposer = SinkDisposer()
let sinkAndSubscription = self.run(observer, cancel: disposer)
// 篇幅原因猪贪,我們省略一些代碼跷敬,方便我們理解
...
return disposer
}
}
}
- 關于銷毀代碼和調度者代碼這里不分析
-
self.run
這個代碼最終由我們生產者Producer
延伸到我們具體的事務代碼AnonymousObservable.run
override func run (...) {
let sink = AnonymousObservableSink(observer: observer, cancel: cancel)
let subscription = sink.run(self)
return (sink: sink, subscription: subscription)
}
-
sink.run
的寫法也是比較好的,業(yè)務處理的還是下沉了热押,讓分工更加明確
func run(_ parent: Parent) -> Disposable {
return parent._subscribeHandler(AnyObserver(self))
}
-
parent
就是上面?zhèn)鬟^來的AnonymousObservable
對象 - 我們非常興奮的看到
AnonymousObservable._subscribeHandler
,從這句代碼我們解惑了為什么我們的序列訂閱
的時候流程會執(zhí)行我們序列閉包
西傀,然后去執(zhí)行發(fā)送響應
- 發(fā)送響應的代碼等會分析,這里還有一個比較重要的家伙
AnyObserver(self)
public init<O : ObserverType>(_ observer: O) where O.E == Element {
self.observer = observer.on
}
- 在這個構造方法里面桶癣,我們創(chuàng)建了一個結構體
AnyObserver
保存了一個信息AnonymousObservableSink .on 函數
拥褂,不是AnonymousObservableSink
,這個地方一般初次來到這里的人都會犯錯誤。不知道你是否意識到了牙寞!
發(fā)送響應
我們從上面的分析饺鹃,非常清晰:
obserber.onNext("Cooci - 框架班級")
的本質是: AnyObserver.onNext("Cooci - 框架班級")
這時候發(fā)現我們的AnyObserver
是沒有這個方法,這很正常间雀!一般思路悔详,找父類,找協(xié)議
extension ObserverType {
public func onNext(_ element: E) {
self.on(.next(element))
}
}
- 外界
obserber.onNext("Cooci - 框架班級")
再次變形 :AnyObserver.on(.next("Cooci - 框架班級"))
,這里大家一定要主要惹挟,這個AnyObserver
調用了on
里面?zhèn)鞯氖?.next函數
,.next函數
帶有我們最終的參數
public struct AnyObserver<Element> : ObserverType {
public init<O : ObserverType>(_ observer: O) where O.E == Element {
self.observer = observer.on
}
public func on(_ event: Event<Element>) {
return self.observer(event)
}
}
-
self.observer
構造初始化就是:AnonymousObservableSink .on 函數
- 看到這里又要變形咯:
self.observer(event)
->AnonymousObservableSink .on(event)
其中event = .next("Cooci - 框架班級")
最終我們的核心邏輯又回到了sink
這個神奇的管子茄螃,看到這里不禁拍案叫絕,RxSwift
這個設計能力连锯,還有誰~~~
class AnonymousObservableSink<O: ObserverType>: Sink<O>, ObserverType {
func on(_ event: Event<E>) {
switch event {
case .next:
if load(self._isStopped) == 1 {
return
}
self.forwardOn(event)
case .error, .completed:
if fetchOr(self._isStopped, 1) == 0 {
self.forwardOn(event)
self.dispose()
}
}
}
}
```Swift
* `self.forwardOn(event)` 這也是執(zhí)行的核心代碼归苍,因為 `AnonymousObservableSink` 繼承 `Sink` 這里還有封裝用狱,請看下面的代碼
class Sink<O : ObserverType> : Disposable {
final func forwardOn(_ event: Event<O.E>) {
if isFlagSet(self._disposed, 1) {
return
}
self._observer.on(event)
}
}
* 其中 `self._observer` 就是我們初始化保存的 `觀察者:AnonymousObserver`
* 那么我們變形得出本質就是:`AnonymousObserver.on(.next("Cooci - 框架班級"))`,我的天啊! 這里邏輯輾轉回到了我們 `訂閱序列` 時候創(chuàng)建的 `AnonymousObserver` 的參數閉包的調用!所有的一切感覺是這樣的啰嗦拼弃,但又是這么的順其資源夏伊。
```Swift
let observer = AnonymousObserver<E> { event in
switch event {
case .next(let value):
onNext?(value)
case .error(let error):
if let onError = onError {
onError(error)
}
else {
Hooks.defaultErrorHandler(callStack, error)
}
disposable.dispose()
case .completed:
onCompleted?()
disposable.dispose()
}
}
- 判斷
event
進而調用onNext?(value)
,因為枚舉的關聯值(Swift
很強大的功能)value = "Cooci - 框架班級"
, 接下來就是外界onNext閉包的調用傳參
,那么這個時候源碼解析到這里肴敛,我相信你已經完全掌握了RxSwift
的核心邏輯署海,最后這里附上我們的分析圖解
總結:RxSwift的結構
- 1:就是序列感念 滿世界都是序列 - 編碼統(tǒng)一 ,隨時隨地享用
- 2:通過函數式思想吧一些列的需求操作下沉(把開發(fā)者不關心的東西封裝) - 優(yōu)化代碼医男,節(jié)省邏輯
- 3:
RxSwift
最典型的特色就是解決Swift
這門靜態(tài)語言的響應能力砸狞,利用隨時間維度序列變化為軸線,用戶訂閱關心能隨軸線一直倍扑螅活刀森,達到訂閱一次,響應一直持續(xù)~
就問此時此刻還有誰报账?45度仰望天空研底,該死!我這無處安放的魅力透罢!