如下圖贵白,信號(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ì)那么困難寥裂!