ReactiveCocoa系列之signal流程詳解

如下圖贵白,信號(hào)的創(chuàng)建到事件的分發(fā)再到事件的最終執(zhí)行流程圖”琅荩可以看到,信號(hào)的整體實(shí)現(xiàn)還是比較復(fù)雜的猬膨。因RAC的學(xué)習(xí)資料不多角撞,而且其實(shí)現(xiàn)流程本官一直沒(méi)看到,故作此文勃痴。

信號(hào)的實(shí)現(xiàn)分為七步驟谒所,每一步驟代表一個(gè)圓。希望通過(guò)剖析信號(hào)的實(shí)現(xiàn)步驟沛申,能夠讓新手同志對(duì)RAC有更為全面的理解劣领。閱讀此文可以結(jié)合源碼看,會(huì)有更好的效果铁材。

流程圖

第一步:初始化信號(hào)尖淘。這里有兩個(gè)很重要的兩個(gè)概念--“內(nèi)部分發(fā)器、事件源”著觉。這兩個(gè)概念是本人自己的理解村生,在你還木有形成自己的獨(dú)到理解之前,可以暫時(shí)這樣理解饼丘。請(qǐng)不要執(zhí)著于概念趁桃,概念只是幫你理解,當(dāng)你真正理解肄鸽,概念就變得不再重要卫病。在初始化里面,主要是生成了一個(gè)“內(nèi)部分發(fā)器”典徘,并且立即執(zhí)行“事件源”蟀苛。

內(nèi)部分發(fā)器:初始化時(shí)候創(chuàng)建,它也是一個(gè)Observer類(lèi)烂斋。只是它比較特殊屹逛,它的初始化注定了它只是用來(lái)分發(fā)事件础废。如下圖:obs就是一個(gè)分發(fā)器,在分發(fā)sendNext()或者sendFaild()等事件后罕模,“內(nèi)部分發(fā)器”就會(huì)執(zhí)行的指定的源碼评腺,即圖二的源碼。這段源碼最主要的功能就是遍歷“觀察者集合”并分發(fā)事件給相應(yīng)的“觀察者”淑掌,觀察者就會(huì)執(zhí)行相應(yīng)的操作啦蒿讥。詳細(xì)源碼可以參看源項(xiàng)目。

圖一

如下是信號(hào)的初始化源碼的一部分抛腕。事件發(fā)生了--obs.sendNext(5)芋绸,觀察者們紛紛行動(dòng)起來(lái)(執(zhí)行相應(yīng)操作)!這里的操作就是上圖閉包內(nèi)的“print(value)”担敌。

圖二

事件源:這又是干嘛的摔敛?看如下的源代碼就知道它是一個(gè)函數(shù),初始化后會(huì)立即執(zhí)行全封。你可以在signal初始化的時(shí)候在這個(gè)事件源里面寫(xiě)事件(請(qǐng)求網(wǎng)絡(luò)等等)马昙。

圖三

第二步:信號(hào)創(chuàng)建好了,接下來(lái)當(dāng)然是觀察并執(zhí)行相應(yīng)的操作了刹悴。如圖一的代碼:sig.observeNext閉包行楞,這就是觀察者收到分發(fā)的事件后要干的事:打印value。那么在sig.observeNext時(shí)土匀,signal都干了什么呢子房?請(qǐng)看第三步。

第三步:調(diào)用observeNext后就走到下面這個(gè)方法里了就轧,很明顯证杭,它根據(jù)next(value)函數(shù)初始化一個(gè)“觀察者”,這個(gè)觀察者很重要钓丰,就是這個(gè)觀察者會(huì)收到“內(nèi)部分發(fā)器”的廣播躯砰,然后執(zhí)行事件對(duì)應(yīng)的操作。怎么做到的呢? 請(qǐng)往下看携丁。

第四步:首圖第四步的所謂監(jiān)聽(tīng)觀察者可能有些不當(dāng)琢歇,其實(shí)就是將觀察者加入集合,有事發(fā)生梦鉴,告訴這些觀察者李茫。如下,就是調(diào)用一個(gè)observe函數(shù)肥橙。

圖四

第五步:根據(jù)上下文調(diào)用魄宏,接著是進(jìn)入了如下的方法〈娣ぃ看到insert方法了吧宠互,信號(hào)即signal就是當(dāng)你調(diào)用observeNext/failed等后(圖一的sig.observeNext閉包)胜卤,觀察者就被塞進(jìn)了“觀察者集合”里铝侵,也就是塞進(jìn)了atomicObservers辣吃。內(nèi)部分發(fā)器分發(fā)事件后蒿叠,會(huì)遍歷這個(gè)“集合”,讓所有觀察者執(zhí)行各自的操作券册。

第六步:觀察者到位频轿,即觀察者已經(jīng)在atomicObservers集合里了。接下來(lái)“內(nèi)部分發(fā)器”分發(fā)事件烁焙。怎么分發(fā)呢航邢?很簡(jiǎn)單,就是sendNext/completed/failed/interrupted骄蝇。圖一的“obs.sendNext(5)”就是事件分發(fā)的一種(四種)了膳殷。

第七步:根據(jù)上一步,事件都已經(jīng)分發(fā)了(例如乞榨,觀察的車(chē)輛爆炸了)秽之,那接下來(lái)就是遍歷“觀察者集合”,讓每個(gè)觀察者執(zhí)行自己綁定的操作了(有的觀察者撥打120吃既、有的觀察者逃跑、有的觀察者救人)跨细。當(dāng)然鹦倚,現(xiàn)實(shí)不會(huì)有人故意去觀察車(chē)輛爆炸,呵呵冀惭。

至此震叙,信號(hào)的整個(gè)流程就實(shí)現(xiàn)了。思想似乎很簡(jiǎn)單散休,但是一步一步的實(shí)現(xiàn)起來(lái)媒楼,卻又并不是那么輕而易舉。這其中戚丸,RAC的作者肯定是費(fèi)了一番功夫划址,而這番功夫,就是值得我們?nèi)ネ嫖断薷⑷W(xué)習(xí)的地方夺颤。

以上是本人的拙見(jiàn),如有不足之處胁勺,還請(qǐng)指摘世澜!

下一篇將詳細(xì)闡述SignalProducer的實(shí)現(xiàn)流程,理解了Signal和SignalProducer的實(shí)現(xiàn)原理署穗,那么對(duì)RAC的使用也不會(huì)那么困難寥裂!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嵌洼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子封恰,更是在濱河造成了極大的恐慌麻养,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俭驮,死亡現(xiàn)場(chǎng)離奇詭異回溺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)混萝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)遗遵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人逸嘀,你說(shuō)我怎么就攤上這事车要。” “怎么了崭倘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵翼岁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我司光,道長(zhǎng)琅坡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任残家,我火速辦了婚禮榆俺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坞淮。我一直安慰自己茴晋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布回窘。 她就那樣靜靜地躺著诺擅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啡直。 梳的紋絲不亂的頭發(fā)上烁涌,一...
    開(kāi)封第一講書(shū)人閱讀 52,785評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音付枫,去河邊找鬼烹玉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阐滩,可吹牛的內(nèi)容都是我干的二打。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼掂榔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼继效!你這毒婦竟也來(lái)了症杏?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瑞信,失蹤者是張志新(化名)和其女友劉穎厉颤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體凡简,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逼友,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秤涩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帜乞。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖筐眷,靈堂內(nèi)的尸體忽然破棺而出黎烈,到底是詐尸還是另有隱情,我是刑警寧澤匀谣,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布照棋,位于F島的核電站,受9級(jí)特大地震影響武翎,放射性物質(zhì)發(fā)生泄漏烈炭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一宝恶、第九天 我趴在偏房一處隱蔽的房頂上張望梳庆。 院中可真熱鬧,春花似錦卑惜、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至欺栗,卻和暖如春毫痕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迟几。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工消请, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人类腮。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓臊泰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蚜枢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缸逃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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

  • 前言由于時(shí)間的問(wèn)題针饥,暫且只更新這么多了,后續(xù)還會(huì)持續(xù)更新本文《最快讓你上手ReactiveCocoa之進(jìn)階篇》需频,目...
    Karos_凱閱讀 1,741評(píng)論 0 6
  • 標(biāo)簽: iOS RAC 概述 ReactiveCocoa是一個(gè)函數(shù)響應(yīng)式編程框架丁眼,它能讓我們脫離Cocoa AP...
    GodyZ閱讀 7,541評(píng)論 16 97
  • 1.ReactiveCocoa常見(jiàn)操作方法介紹1.1 ReactiveCocoa操作須知所有的信號(hào)(RACSign...
    IIronMan閱讀 2,600評(píng)論 2 17
  • 1.ReactiveCocoa常見(jiàn)操作方法介紹。 1.1 ReactiveCocoa操作須知 所有的信號(hào)(RACS...
    萌芽的冬天閱讀 1,026評(píng)論 0 5
  • 作者:百曉生 在文章開(kāi)篇昭殉,我想先說(shuō)說(shuō)另一個(gè)遠(yuǎn)方的姑娘苞七。她叫張玉環(huán),張無(wú)忌的張挪丢,楊玉環(huán)的玉環(huán)蹂风,但是我喜歡叫她嬛嬛,嬛...
    暉說(shuō)閱讀 152評(píng)論 0 0