小編給大家分享一下iOS中多倒計時場景的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站設(shè)計、網(wǎng)站建設(shè)與策劃設(shè)計,吳江網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:吳江等地區(qū)。吳江做網(wǎng)站價格咨詢:18980820575
背景
在我們開發(fā)APP的過程中,或多或少都遇到過需要使用倒計時的場景,大多數(shù)應(yīng)用中的用戶登錄注冊過程中獲取驗證碼的倒計時,電商或者外賣APP中的訂單送達的倒計時,以及秒殺類APP的秒殺倒計時等。對于這些需要倒計時的場景,通常情況下的解決方案是:在需要展示倒計時的各View模塊各自維護一個自己的倒計時Timer,通過Timer的回調(diào)和模塊本身需要的倒計時時間來更新對應(yīng)View的倒計時的顯示,再在此基礎(chǔ)上加上對應(yīng)的時間校準方案,一個簡單的倒計時需求就完成了。
問題
對于APP內(nèi)倒計時的業(yè)務(wù)如果只出現(xiàn)在單一的頁面或者是少數(shù)的頁面場景中沒什么太大的問題的,通常對于秒殺類APP的倒計時場景往往是在某個頁面或者某幾個頁面中有多個倒計時共同存在的,這種產(chǎn)品需求的技術(shù)展現(xiàn)方式可能是TableView或者CollectionView中的多個Cell,也可能是多個自定義的View模塊,如果我們此時依然使用每個Cell或者每個View模塊各自維護一個單獨的倒計時Timer,當(dāng)前APP內(nèi)就會同時存在多個定時器Timer,這對于性能來說是存在一定程度的影響的。那么我們怎么才能更好的解決多倒計時場景的問題呢?
解決方案
既然我們不能讓每一個顯示倒計時的View模塊各自維護一個定時器Timer,那我們就提供一個專門的模塊TimerService來提供倒計時的服務(wù),TimerService內(nèi)部負責(zé)維護唯一一個定時器,同時提供添加和移除監(jiān)聽者的接口以及監(jiān)聽者需要實現(xiàn)的協(xié)議protocol,內(nèi)部通過HashTable來存儲監(jiān)聽者,每次定時器回調(diào),遍歷所有監(jiān)聽者進行回調(diào),監(jiān)聽者在不需要接收定時器回調(diào)的時候只需要從TimerService中移除即可。
TimerService.h對外提供的API和監(jiān)聽者需要實現(xiàn)的協(xié)議主要如下:
//監(jiān)聽者需要實現(xiàn)的協(xié)議 @protocol TimerListener <NSObject> @required - (void)didOnTimer:(TimerService *)timer; @end //對接提供的主要接口 + (instancetype)sharedInstance; - (void)addListener:(id<TimerListener>)listener; - (void)removeListener:(id<TimerListener>)listener;
TimerService.m的內(nèi)部主要實現(xiàn)如下:
//定時器回調(diào) - (void)onTimer { [self.map.allObjects enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { id<TimerListener> listener = obj; if([listener respondsToSelector:@selector(didOnTimer:)]){ [listener didOnTimer:self]; } }]; } #pragma mark - public - (void)addListener:(id<TimerListener>)listener { TIMER_SERVICE_LOCK(self.operationsLock) if(![self.map containsObject:listener]){ [self.map addObject:listener]; if(self.map.count > 0){ //啟動 [self startTimer]; } } TIMER_SERVICE_UNLOCK(self.operationsLock) } - (void)removeListener:(id<TimerListener>)listener { TIMER_SERVICE_LOCK(self.operationsLock) if([self.map containsObject:listener]){ [self.map removeObject:listener]; if(self.map.count == 0){ //暫停 [self stopTimer]; } } TIMER_SERVICE_UNLOCK(self.operationsLock) }
使用
需要接收定時器回調(diào)的模塊,只要實現(xiàn)TimerListener協(xié)議,在需要接收定時器回調(diào)的時把其添加到TimerService中,在業(yè)務(wù)不需要接收定時器回調(diào)的時候把其從TimerService中移除即可,這樣所有的倒計時業(yè)務(wù)只需要維護一個定時器即可搞定。
以上是“iOS中多倒計時場景的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)站名稱:iOS中多倒計時場景的示例分析
當(dāng)前地址:http://www.rwnh.cn/article8/ggdoip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、軟件開發(fā)、電子商務(wù)、、網(wǎng)站營銷、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)