上一篇文章在旱,我們分析了RxSwift的核心原理闯袒。這篇文章我們看一下核心原理在RxSwift定時器上的應用波材。
關于定時器的實現(xiàn)谒养。OC里我們已經知道有多種挺狰,常用的有NSTimer,和GCD的封裝蝴光,如YYTimer。而在Swift里达址,NStimer和OC里原理與功能一樣蔑祟。尤其在與滑動聯(lián)動的時候,也需要加入runloop的Common模式沉唠。
GCD實現(xiàn)定時器的優(yōu)點在于不受runloop影響疆虚,而且更加準確。
本文先介紹Swift里GCD如何實現(xiàn)定時器,而后著重于RxSwift里的定時器是如何封裝的径簿。
一:普通GCD的實現(xiàn)定時器
直接上代碼罢屈。這沒啥可講的,跟OC里用GCD實現(xiàn)計時器原理上沒什么差別篇亭。
二:RxSwift定時器的實現(xiàn)缠捌。
能夠看出,代碼也比較簡單译蒂。我們接下來著重于代碼的封裝曼月。
1.interval的實現(xiàn)。我們點進去查看interval柔昼,經過兩次跳轉哑芹,我們來到了實現(xiàn)部分,如下
咦捕透?有沒有一種感覺聪姿,這個代碼我好想在哪見過?對乙嘀,上一篇文章里末购,我們研究Observable的時候,有一個AnonymousObservable類乒躺。我們能發(fā)現(xiàn):
①他們同樣是繼承于Producer招盲。②同樣是保存了創(chuàng)建時傳進來的數(shù)據(jù)。③同樣是父類觸發(fā)的run方法嘉冒。④同樣是創(chuàng)建了sink類并調用sink類的run方法曹货。他們唯一的區(qū)別就在于Timer與AnonymousObservable分工不同。體現(xiàn)了誰的事情誰做的設計原則讳推。
如果上一篇文章中的流程依然了然于胸顶籽,那么看到這,其實對于后面的邏輯應該已經有了些猜測了银觅。
2.我們繼續(xù)點進去查看這個TimerSink礼饱。
我們看到,這個紅框內是3個參數(shù)外加一個尾隨閉包究驴,同時我們發(fā)現(xiàn)了一段非常熟悉的代碼??
self.forwardOn(.next(state))
在上篇文章中镊绪,我們就知道,只要調用這個self.forwardOn(.next(state))方法洒忧,subscribe就會執(zhí)行相應的閉包蝴韭,見下圖(來自底層原理探究一文的部分節(jié)選)
3.現(xiàn)在關鍵就在于這個尾隨閉包誰在調用。我們繼續(xù)點進去查看
4.整體實現(xiàn)方式熙侍,跟我們在文章開頭自己實現(xiàn)的GCD計時器一模一樣榄鉴。我們關鍵找到了這個尾隨閉包的實現(xiàn)履磨。
到此。RxSwift的GCD實現(xiàn)的定時器就很清晰了:
當我們執(zhí)行Observable<Int>.interval方法時庆尘,Rx會直接幫我們創(chuàng)建好GCD計時器相關的代碼剃诅。并根據(jù)參數(shù)執(zhí)行OnNext閉包方法。
關于Rx計時器的停止驶忌,也很簡單矛辕。可以直接調用error或者ompleted用于完成當前次訂閱位岔。也可以直接銷毀該計時器:通過disposeBag()方法再次創(chuàng)建并賦值給全局變量disposeBag如筛,從而釋放掉之前的全局變量disposeBag,達到回收該次Observable對象的目的抒抬。