RxSwift核心邏輯

通過(guò)上一篇了解到了RxSwift的使用三步曲绒瘦,即創(chuàng)建、訂閱扣癣、發(fā)送信號(hào)惰帽。但是其實(shí)現(xiàn)是怎樣的呢,我們來(lái)了解一下父虑。先上圖:

RxSwift核心邏輯.png

圖是通過(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繼承于ProducerProducer中定義了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

subscribe方法實(shí)現(xiàn)
subscribe方法中創(chuàng)建了AnonymousObserver對(duì)象躁染,并對(duì)傳入的event進(jìn)行分類處理鸣哀。在return的時(shí)候調(diào)起了Observablesubscribe方法。

AnonymousObserver:繼承于ObserverBase吞彤,保存了event閉包我衬,對(duì)父類的onCore方法重寫。

ObserverBase:遵守了DisposableObserverType協(xié)議备畦,實(shí)現(xiàn)了協(xié)議的on方法和dispose方法低飒,定義了自己的onCore方法。

subscribe也形成一條class鏈懂盐。AnonymousObserver -> ObserverBase -> DisposableObserverType協(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中端仰。在Producersubscribe中通過(guò)調(diào)用子類的run->AnonymousObservable.run

AnonymousObservable的run方法中創(chuàng)建了AnonymousObservableSink對(duì)象田藐,并調(diào)用了sink.run荔烧。AnonymousObservableSink繼承于Sink,并實(shí)現(xiàn)了on和run方法汽久。

這里的parenttypealias 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()
然后執(zhí)行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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末垫毙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拱绑,更是在濱河造成了極大的恐慌综芥,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猎拨,死亡現(xiàn)場(chǎng)離奇詭異膀藐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)红省,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門额各,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人吧恃,你說(shuō)我怎么就攤上這事虾啦。” “怎么了痕寓?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵傲醉,是天一觀的道長(zhǎng)厨疙。 經(jīng)常有香客問(wèn)我萌京,道長(zhǎng),這世上最難降的妖魔是什么考蕾? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任礼仗,我火速辦了婚禮吐咳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘元践。我一直安慰自己韭脊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布单旁。 她就那樣靜靜地躺著沪羔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慎恒。 梳的紋絲不亂的頭發(fā)上任内,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天撵渡,我揣著相機(jī)與錄音,去河邊找鬼死嗦。 笑死趋距,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的越除。 我是一名探鬼主播节腐,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼摘盆!你這毒婦竟也來(lái)了翼雀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤孩擂,失蹤者是張志新(化名)和其女友劉穎狼渊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體类垦,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狈邑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚤认。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片米苹。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖砰琢,靈堂內(nèi)的尸體忽然破棺而出蘸嘶,到底是詐尸還是另有隱情,我是刑警寧澤陪汽,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布训唱,位于F島的核電站,受9級(jí)特大地震影響掩缓,放射性物質(zhì)發(fā)生泄漏雪情。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一你辣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尘执,春花似錦舍哄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至丧靡,卻和暖如春蟆沫,著一層夾襖步出監(jiān)牢的瞬間籽暇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工饭庞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留戒悠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓舟山,卻偏偏與公主長(zhǎng)得像绸狐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子累盗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 透視RxSwift核心邏輯 篇幅稍微有點(diǎn)長(zhǎng)寒矿,了解程度不同,可以跳過(guò)某些部分若债。如果對(duì)源碼比較熟悉的符相,建議直接看圖就行...
    silasjs閱讀 1,363評(píng)論 2 21
  • Observable 的流程 創(chuàng)建序列 - Observable .create 訂閱序列 - ob.subscr...
    smart_M閱讀 199評(píng)論 0 1
  • 注:代碼塊中的...是一些不需要顯示的代碼,直接用...替代了蠢琳,rx的思維導(dǎo)圖我后面重新畫了一張啊终,老漂亮了,畫出經(jīng)...
    越來(lái)越胖了閱讀 502評(píng)論 0 3
  • 本篇接著上篇函數(shù)響應(yīng)式編程思想 & RxSwift 核心邏輯(一)繼續(xù)詳細(xì)分析上篇沒有提到的地方挪凑。 序列繼承鏈 l...
    簡(jiǎn)_愛SimpleLove閱讀 444評(píng)論 2 1
  • 隨著函數(shù)響應(yīng)式編程成為現(xiàn)在很多編程語(yǔ)言的主流編程思想孕索,我們?cè)桨l(fā)的感嘆這種思想的魅力,他極大的減少了我們的膠水代碼躏碳,...
    Ldies閱讀 768評(píng)論 0 8