如下圖,信號(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)分發(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è)事件源里面寫事件(請(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)入了如下的方法??吹絠nsert方法了吧,信號(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ā)了(例如,觀察的車輛爆炸了),那接下來(lái)就是遍歷“觀察者集合”,讓每個(gè)觀察者執(zhí)行自己綁定的操作了(有的觀察者撥打120、有的觀察者逃跑、有的觀察者救人)。當(dāng)然,現(xiàn)實(shí)不會(huì)有人故意去觀察車輛爆炸,呵呵。
至此,信號(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ì)那么困難!