91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS中多倒計時場景的示例分析

發布時間:2021-07-28 14:39:40 來源:億速云 閱讀:158 作者:小新 欄目:移動開發

小編給大家分享一下iOS中多倒計時場景的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

背景

在我們開發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中移除即可,這樣所有的倒計時業務只需要維護一個定時器即可搞定。

以上是“iOS中多倒計時場景的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ios
AI

桂平市| 中西区| 麦盖提县| 鞍山市| 衡山县| 天长市| 胶州市| 塔河县| 松原市| 喀喇沁旗| 怀来县| 巨野县| 航空| 皋兰县| 方山县| 南康市| 奎屯市| 瓮安县| 麻栗坡县| 嵊州市| 黄龙县| 天津市| 长汀县| 揭东县| 武山县| 娱乐| 闻喜县| 景洪市| 博罗县| 安庆市| 怀安县| 临桂县| 湘潭县| 交城县| 水城县| 周口市| 怀柔区| 蒙自县| 崇明县| 陆丰市| 维西|