通過(guò)上一篇了解到了RxSwift的使用三步曲绒瘦,即創(chuàng)建、訂閱扣癣、發(fā)送信號(hào)惰帽。但是其實(shí)現(xiàn)是怎樣的呢,我們來(lái)了解一下父虑。先上圖:
圖是通過(guò)三步曲的流程來(lái)整理该酗,接下來(lái)我們一步一步看。
create
點(diǎn)擊進(jìn)入create方法士嚎,找到這樣一個(gè)func呜魄,看不到實(shí)際實(shí)現(xiàn),但是看注解發(fā)現(xiàn)create是一個(gè)路由莱衩,然后就全局搜索create爵嗅,找到Create.swift。
在這里的create中創(chuàng)建了AnonymousObservable
笨蚁,并傳入了subscribe閉包
在
AnonymousObservable
中可以看到保存了subscribeHandler閉包睹晒,并且重寫了父類的run方法趟庄。而
AnonymousObservable
繼承于Producer
。Producer
中定義了run方法伪很,重寫了父類的subscribe方法岔激,在這里是訂閱方法的具體實(shí)現(xiàn)。
Producer
則繼承于Observable
是掰。Observable
中定義了subscribe虑鼎,實(shí)現(xiàn)了asObservable方法。asObservable實(shí)現(xiàn)了一切皆序列键痛,隨時(shí)隨地都可以序列化然后訂閱炫彩。
Observable
遵守ObservableType
協(xié)議。協(xié)議主要是提供subscribe方法絮短,在遵守協(xié)議的類中要實(shí)現(xiàn)方法江兢。
ObservableType
遵守ObservableConvertibleType
協(xié)議。提供了asObservable方法丁频。
至此杉允,create的流程出來(lái)一條線。
AnonymousObservable
- >Producer
- >Observable
- >ObservableType
協(xié)議 - >ObservableConvertibleType
協(xié)議 席里。在這里Observable
作為一個(gè)基類叔磷,定義了協(xié)議的方法。Producer
作為父類實(shí)現(xiàn)重要的調(diào)度奖磁、訂閱改基、觀察者接收功能。AnonymousObservable
則對(duì)外界傳入閉包保存咖为,調(diào)用閉包秕狰,承上啟下。
subscribe
AnonymousObserver
對(duì)象躁染,并對(duì)傳入的event進(jìn)行分類處理鸣哀。在return的時(shí)候調(diào)起了Observable
的subscribe方法。
AnonymousObserver
:繼承于ObserverBase
吞彤,保存了event閉包我衬,對(duì)父類的onCore方法重寫。
ObserverBase
:遵守了Disposable
和ObserverType
協(xié)議备畦,實(shí)現(xiàn)了協(xié)議的on方法和dispose方法低飒,定義了自己的onCore方法。
subscribe也形成一條class鏈懂盐。
AnonymousObserver
->ObserverBase
->Disposable
和ObserverType
協(xié)議褥赊。
兩條看似沒有關(guān)聯(lián)的鏈形成了,那么它們是怎么走到一起的呢莉恼?>>
在上圖中第二個(gè)紅框里的self.asObservable().subscribe(observer)
為兩條鏈聯(lián)系的重點(diǎn)拌喉。
我們知道asObservable()
之后就變成序列Observable
對(duì)象速那,序列對(duì)象調(diào)用自己的subscribe方法,因沒有具體實(shí)現(xiàn)尿背,下沉到子類Producer
中端仰。在Producer
的subscribe中通過(guò)調(diào)用子類的run->AnonymousObservable.run
。
AnonymousObservable
的run方法中創(chuàng)建了AnonymousObservableSink
對(duì)象田藐,并調(diào)用了sink.run
荔烧。AnonymousObservableSink
繼承于Sink
,并實(shí)現(xiàn)了on和run方法汽久。
這里的
parent
為typealias Parent = AnonymousObservable<Element>
鹤竭,所以這里調(diào)用的是AnonymousObservable.subscribe
,即為create時(shí)傳入的閉包
在這里已經(jīng)開始要執(zhí)行發(fā)送信號(hào)的on事件景醇,接下來(lái)臀稚,看on事件的執(zhí)行AnyObserver
AnyObserver
: 繼承于ObserverType
,并在初始化的時(shí)候保存了observer.on三痰,即上層傳過(guò)來(lái)的AnonymousObservableSink.on
吧寺,在.on中會(huì)進(jìn)入到sink.forwardOn()
self._observer.on(event)
,這里的obsrver在AnonymousObservableSink
初始化的時(shí)候已經(jīng)保存了散劫,通過(guò)run方法傳進(jìn)來(lái)的訂閱時(shí)創(chuàng)建的AnonymousObserver
稚机,所以可以為AnonymousObserver.on(event)
,在其父類ObserverBase
中找到on事件舷丹,通過(guò)onCore傳遞到下層抒钱,執(zhí)行AnonymousObserver.onCore
在這里又執(zhí)行了訂閱時(shí)傳入的事件閉包。
到這里颜凯,整個(gè)流程結(jié)束了。這個(gè)過(guò)程比較繞仗扬,需要一點(diǎn)點(diǎn)打斷點(diǎn)來(lái)看症概,最好是動(dòng)手自己畫一畫,把流程圖梳理出來(lái)就容易明白早芭。我剛開始會(huì)糾結(jié)于閉包的執(zhí)行彼城,以為是里邊的執(zhí)行完回到外邊去執(zhí)行閉包內(nèi)容的,通過(guò)核心邏輯梳理才知道閉包會(huì)穿進(jìn)去退个,在合適的時(shí)候調(diào)用執(zhí)行募壕。
還有里邊的基類、父類的好多语盈,每條鏈都會(huì)有好多個(gè)類繼承舱馅,但是這些類又不多余,每個(gè)分工很明確刀荒,功能不累贅代嗤。對(duì)于方法的聲明用協(xié)議棘钞;基類只提供必要的方法,實(shí)現(xiàn)協(xié)議方法干毅;父類提供子類需要的方法宜猜,做一些調(diào)度統(tǒng)籌事情;子類去具體實(shí)現(xiàn)想要的功能硝逢。
多條鏈形成之后姨拥,會(huì)有一個(gè)類似Manager的類Sink
來(lái)把要處理的東西融合在一起,進(jìn)行事件分發(fā)調(diào)用渠鸽。
End