最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年11月22日 09:33:36   作者:小莫醬  
在我們開發(fā)APP的過程中,或多或少都遇到過需要使用倒計時的場景,這篇文章主要介紹了詳解iOS中多倒計時場景的解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下

背景

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

問題

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

解決方案

既然我們不能讓每一個顯示倒計時的View模塊各自維護一個定時器Timer,那我們就提供一個專門的模塊TimerService來提供倒計時的服務,TimerService內部負責維護唯一一個定時器,同時提供添加和移除監(jiān)聽者的接口以及監(jiān)聽者需要實現(xiàn)的協(xié)議protocol,內部通過HashTable來存儲監(jiān)聽者,每次定時器回調,遍歷所有監(jiān)聽者進行回調,監(jiān)聽者在不需要接收定時器回調的時候只需要從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的內部主要實現(xiàn)如下:


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

使用

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

其他

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

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

相關文章

  • iOS底層實例解析Swift閉包及OC閉包

    iOS底層實例解析Swift閉包及OC閉包

    這篇文章主要為大家介紹了iOS底層實例解析Swift閉包及OC閉包,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • iOS系統(tǒng)的底層通知框架庫示例詳解

    iOS系統(tǒng)的底層通知框架庫示例詳解

    這篇文章主要給大家介紹了關于iOS系統(tǒng)的底層通知框架庫的相關資料,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • iOS動畫-定時對UIView進行翻轉和抖動的方法

    iOS動畫-定時對UIView進行翻轉和抖動的方法

    下面小編就為大家?guī)硪黄猧OS動畫-定時對UIView進行翻轉和抖動的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • iOS新浪微博、騰訊微博分享功能實例

    iOS新浪微博、騰訊微博分享功能實例

    這篇文章主要為大家詳細介紹了iOS新浪微博、騰訊微博分享功能實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • IOS10.11 無法訪問http的問題解決辦法

    IOS10.11 無法訪問http的問題解決辦法

    這篇文章主要介紹了IOS10.11 無法訪問http的問題解決辦法的相關資料,需要的朋友可以參考下
    2016-12-12
  • iOS中UIActivityIndicatorView的用法及齒輪等待動畫實例

    iOS中UIActivityIndicatorView的用法及齒輪等待動畫實例

    UIActivityIndicatorView活動指示器最常見的用法便是用來制作那個程序中的齒輪轉動的等待效果,接下來我們回來簡單整理iOS中UIActivityIndicatorView的用法及齒輪等待動畫實例:
    2016-05-05
  • Swift 共享文件操作小結(iOS 8 +)

    Swift 共享文件操作小結(iOS 8 +)

    本文主要介紹IOS 共享文件,在這里給大家展示實例代碼供大家參考,希望能幫助開發(fā)IOS的同學
    2016-07-07
  • iOS設置可選擇圓角方向的控件圓角

    iOS設置可選擇圓角方向的控件圓角

    在iOS開發(fā)中會遇到設置控件圓角的效果,這篇文章就給大家分享了實現(xiàn)的方法,且可以選擇圓角的方向,有需要的朋友們可以參考借鑒,下面來一起學習學習吧。
    2016-11-11
  • IOS App 無代碼入侵的方法hook詳細介紹

    IOS App 無代碼入侵的方法hook詳細介紹

    這篇文章主要介紹了IOS App 無代碼入侵的方法hook詳細介紹的相關資料,需要的朋友可以參考下
    2016-12-12
  • 比較IOS開發(fā)中常用視圖的四種切換方式

    比較IOS開發(fā)中常用視圖的四種切換方式

    這篇文章給大家介紹了在IOS開發(fā)中常用視圖的四種切換方式以及這四種方式的優(yōu)缺點,這四種方式包括:push,pop、modal、切換窗口的根控制器和添加子視圖,有需要的可以參考借鑒。
    2016-08-08

最新評論

斗六市| 个旧市| 东明县| 宣城市| 绍兴县| 沧源| 南丰县| 庐江县| 如东县| 清水河县| 望谟县| 平邑县| 桐城市| 介休市| 揭东县| 衡南县| 英山县| 贺兰县| 博乐市| 思茅市| 锡林郭勒盟| 木兰县| 岑溪市| 澎湖县| 通城县| 沿河| 九龙坡区| 南澳县| 靖边县| 鹤岗市| 丽水市| 汉中市| 天峻县| 灌阳县| 东莞市| 荔浦县| 蚌埠市| 江山市| 政和县| 怀柔区| 阳原县|