投稿文章,作者:蜻蜓點水
如下圖,信號的創建到事件的分發再到事件的最終執行流程圖。可以看到,信號的整體實現還是比較復雜的。因RAC的學習資料不多,而且其實現流程本官一直沒看到,故作此文。
信號的實現分為七步驟,每一步驟代表一個圓。希望通過剖析信號的實現步驟,能夠讓新手同志對RAC有更為全面的理解。閱讀此文可以結合源碼看,會有更好的效果。
Signal實現流程圖
第一步:初始化信號。這裡有兩個很重要的兩個概念--“內部分發器、事件源”。這兩個概念是本人自己的理解,在你還木有形成自己的獨到理解之前,可以暫時這樣理解。請不要執著於概念,概念只是幫你理解,當你真正理解,概念就變得不再重要。在初始化裡面,主要是生成了一個“內部分發器”,並且立即執行“事件源”。
內部分發器:初始化時候創建,它也是一個Observer類。只是它比較特殊,它的初始化注定了它只是用來分發事件。如下圖:obs就是一個分發器,在分發sendNext()或者sendFaild()等事件後,“內部分發器”就會執行的指定的源碼,即圖二的源碼。這段源碼最主要的功能就是遍歷“觀察者集合”並分發事件給相應的“觀察者”,觀察者就會執行相應的操作啦。詳細源碼可以參看源項目。
圖一
如下是信號的初始化源碼的一部分。事件發生了--obs.sendNext(5),觀察者們紛紛行動起來(執行相應操作)!這裡的操作就是上圖閉包內的“print(value)”。
圖二
事件源:這又是干嘛的?看如下的源代碼就知道它是一個函數,初始化後會立即執行。你可以在signal初始化的時候在這個事件源裡面寫事件(請求網絡等等)。
圖三
第二步:信號創建好了,接下來當然是觀察並執行相應的操作了。如圖一的代碼:sig.observeNext閉包,這就是觀察者收到分發的事件後要干的事:打印value。那麼在sig.observeNext時,signal都干了什麼呢?請看第三步。
第三步:調用observeNext後就走到下面這個方法裡了,很明顯,它根據next(value)函數初始化一個“觀察者”,這個觀察者很重要,就是這個觀察者會收到“內部分發器”的廣播,然後執行事件對應的操作。怎麼做到的呢? 請往下看。
第四步:首圖第四步的所謂監聽觀察者可能有些不當,其實就是將觀察者加入集合,有事發生,告訴這些觀察者。如下,就是調用一個observe函數。
圖四
第五步:根據上下文調用,接著是進入了如下的方法。看到insert方法了吧,信號即signal就是當你調用observeNext/failed等後(圖一的sig.observeNext閉包),觀察者就被塞進了“觀察者集合”裡,也就是塞進了atomicObservers。內部分發器分發事件後,會遍歷這個“集合”,讓所有觀察者執行各自的操作。
圖五
第六步:觀察者到位,即觀察者已經在atomicObservers集合裡了。接下來“內部分發器”分發事件。怎麼分發呢?很簡單,就是sendNext/completed/failed/interrupted。圖一的“obs.sendNext(5)”就是事件分發的一種(四種)了。
第七步:根據上一步,事件都已經分發了(例如,觀察的車輛爆炸了),那接下來就是遍歷“觀察者集合”,讓每個觀察者執行自己綁定的操作了(有的觀察者撥打120、有的觀察者逃跑、有的觀察者救人)。當然,現實不會有人故意去觀察車輛爆炸,呵呵。
至此,信號的整個流程就實現了。思想似乎很簡單,但是一步一步的實現起來,卻又並不是那麼輕而易舉。這其中,RAC的作者肯定是費了一番功夫,而這番功夫,就是值得我們去玩味、去學習的地方。
以上是本人的拙見,如有不足之處,還請指摘!
下一篇將詳細闡述SignalProducer的實現流程,理解了Signal和SignalProducer的實現原理,那麼對RAC的使用也不會那麼困難!