麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > iOS > 正文

詳解iOS中多倒計時場景的解決方案

2019-10-21 18:39:17
字體:
來源:轉載
供稿:網友

背景

在我們開發APP的過程中,或多或少都遇到過需要使用倒計時的場景,大多數應用中的用戶登錄注冊過程中獲取驗證碼的倒計時,電商或者外賣APP中的訂單送達的倒計時,以及秒殺類APP的秒殺倒計時等。對于這些需要倒計時的場景,通常情況下的解決方案是:在需要展示倒計時的各View模塊各自維護一個自己的倒計時Timer,通過Timer的回調和模塊本身需要的倒計時時間來更新對應View的倒計時的顯示,再在此基礎上加上對應的時間校準方案,一個簡單的倒計時需求就完成了。

問題

對于APP內倒計時的業務如果只出現在單一的頁面或者是少數的頁面場景中沒什么太大的問題的,通常對于秒殺類APP的倒計時場景往往是在某個頁面或者某幾個頁面中有多個倒計時共同存在的,這種產品需求的技術展現方式可能是TableView或者CollectionView中的多個Cell,也可能是多個自定義的View模塊,如果我們此時依然使用每個Cell或者每個View模塊各自維護一個單獨的倒計時Timer,當前APP內就會同時存在多個定時器Timer,這對于性能來說是存在一定程度的影響的。那么我們怎么才能更好的解決多倒計時場景的問題呢?

iOS,倒計時,場景

解決方案

既然我們不能讓每一個顯示倒計時的View模塊各自維護一個定時器Timer,那我們就提供一個專門的模塊TimerService來提供倒計時的服務,TimerService內部負責維護唯一一個定時器,同時提供添加和移除監聽者的接口以及監聽者需要實現的協議protocol,內部通過HashTable來存儲監聽者,每次定時器回調,遍歷所有監聽者進行回調,監聽者在不需要接收定時器回調的時候只需要從TimerService中移除即可。

TimerService.h對外提供的API和監聽者需要實現的協議主要如下:

//監聽者需要實現的協議@protocol TimerListener <NSObject>@required- (void)didOnTimer:(TimerService *)timer;@end//對接提供的主要接口+ (instancetype)sharedInstance;- (void)addListener:(id<TimerListener>)listener;- (void)removeListener:(id<TimerListener>)listener;

TimerService.m的內部主要實現如下:

//定時器回調- (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)}

使用

需要接收定時器回調的模塊,只要實現TimerListener協議,在需要接收定時器回調的時把其添加到TimerService中,在業務不需要接收定時器回調的時候把其從TimerService中移除即可,這樣所有的倒計時業務只需要維護一個定時器即可搞定。

其他

當然要很好的搞定一個倒計時還需要解決其他一些問題,比如客戶端時間校準問題,關于這個問題推薦細細讀一下MrPeak君的一篇文章《iOS關于時間的處理》。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 有色视频在线观看 | 中国美女一级黄色片 | 久久久三区| 在线播放免费播放av片 | 欧美视频一区二区三区四区 | 天天干天天碰 | 成年人黄色免费网站 | 中国杭州少妇xxxx做受 | 欧美精品a∨在线观看不卡 午夜精品影院 | 黄视频免费在线观看 | 亚洲国产精品久久久久久久 | 欧美顶级毛片在线播放小说 | 国产精品久久久久久久久久三级 | 成人黄色小视频在线观看 | 欧美日韩亚洲不卡 | 日本韩国欧美一级片 | 免费视频一区 | 深夜精品福利 | 男女牲高爱潮免费视频男女 | 国产成年人视频网站 | 牛牛视频在线 | 免费a视频| 久久久久亚洲国产精品 | 少妇的肉体的满足毛片 | 欧美一级特黄aaaaaaa什 | 国产精品久久久久久久模特 | 色天天综合网 | 午夜精品影院 | 日本中文高清 | 日本在线播放一区二区三区 | 毛片在线视频观看 | 天海翼无删减av三级在线观看 | 久久精品国产精品亚洲 | 亚洲视频精选 | 色毛片 | 欧美三级欧美成人高清www | 国产一区二区亚洲 | 人人舔人人插 | 精品黑人一区二区三区国语馆 | fc2国产成人免费视频 | 国产精品久久久久久久av |