多個cell中展示倒計時续捂,本地和服務(wù)器時間差異解決方案

公司需要做限時搶購的業(yè)務(wù)汇陆,這里面有兩個需求點:

1.在多個cell中顯示倒計時

在每個cell中添加定時器是不現(xiàn)實的怒炸,必定會增加許多性能開銷,所以肯定是使用一個定時器毡代,關(guān)鍵在于如何通知到cell刷新UI

2.本地時間可能和服務(wù)器時間存在誤差

有的手機可能時間沒有和網(wǎng)絡(luò)同步阅羹,或者用戶故意調(diào)整了時間,所以本地時間存在錯誤的可能教寂,所以就定下使用服務(wù)器時間

整體思路

1.在多個cell中顯示倒計時

思路是這樣的:將需要接收定時器通知的對象注冊到定時器單例中捏鱼,存放在數(shù)組里面,當(dāng)定時器更新的時候遍歷數(shù)組回調(diào)通知

定時器的創(chuàng)建

注意:默認暫停定時器,定時器默認是加載到當(dāng)前runloop中的孝宗,在進行UI界面操作比如滑動列表時穷躁,由于在main runloop中NSTimer是同步交付的被“阻塞”耕肩,就會導(dǎo)致NSTimer計時出現(xiàn)延誤因妇。

解決這種延誤的方法,一種是在子線程中進行NSTimer的操作猿诸,在主線程中修改UI界面顯示操作結(jié)果婚被;另一種是仍然在主線程中進行NSTimer操作,但是將NSTimer實例加到main runloop的特定mode(模式)中梳虽。避免被復(fù)雜運算操作或者UI界面刷新所干擾址芯。

timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: {[unowned self] (_) in
     self.onTimer()
})
//下面這種方法要求onTimer是@objc
//Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(onTimer), userInfo: nil, repeats: true) 

注冊通知

這里使用NSHashTable存放注冊對象的數(shù)組,可以防止循環(huán)引用注冊對象釋放不掉
swift的protocol是一個很好的東西窜觉,這樣可以更好的規(guī)范誰可以注冊通知

@objc
protocol TimerListener: class {
    func didOnTimer(announcer: YZTimerUtil, timeInterval: TimeInterval)
}

private let map: NSHashTable<TimerListener> = NSHashTable<TimerListener>.weakObjects()

何時注冊刪除通知

一開始是在willDisplay谷炸、didEndDisplaying方法中進行通知注冊的,后來發(fā)現(xiàn)沒有必要禀挫,因為cell創(chuàng)建后就是要接收通知的willDisplay旬陡、didEndDisplaying中還要進行cell類型的判斷,所以就改為cell- init/deinit中

deinit {
        YZTimerUtil.sharedInstance.removeListener(listener: self)
    }
  //這里cell使用的是xib
    override func awakeFromNib() {
        super.awakeFromNib()
        YZTimerUtil.sharedInstance.addListener(listener: self)
    }

2.本地時間可能和服務(wù)器時間存在誤差

這里看項目需求吧语婴,如果項目對時間要求沒有那么嚴格描孟,不做服務(wù)器時間對比也行驶睦,反正服務(wù)器那邊會進行判斷的,有些對時間要求嚴格的肯定是要做對比的匿醒,比如手機手令的動態(tài)碼

我的思路是在定時器初始化的時候進行網(wǎng)絡(luò)請求场航,拿到服務(wù)器的當(dāng)前時間,然后計算本地和服務(wù)器時間的差值廉羔,后面就用這個差值進行計算溉痢。當(dāng)然,受網(wǎng)絡(luò)狀態(tài)的影響憋他,這個時間可能也不是準確的時間适室,但是這個時間誤差會在一個可控范圍內(nèi),為了精確時間差举瑰,可以每隔一段時間就校準一次捣辆,如果要更精準的,可以通過請求的requestTime/responseTime進行算法計算

 // 從服務(wù)器請求最新的時間此迅,簡單示例
    func resetServerTime() {
        // 從服務(wù)器請求最新的時間
        // ...
        var success = true        
        if success {
            // 請求成功
            serverTimeInterval = 0
        } else {
            // 如果請求失敗汽畴,隔一段時間再請求一次
            perform(#selector(resetServerTime), with: nil, afterDelay: rloadTimeInterval)
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市耸序,隨后出現(xiàn)的幾起案子忍些,更是在濱河造成了極大的恐慌,老刑警劉巖坎怪,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罢坝,死亡現(xiàn)場離奇詭異,居然都是意外死亡搅窿,警方通過查閱死者的電腦和手機嘁酿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來男应,“玉大人闹司,你說我怎么就攤上這事°迤” “怎么了游桩?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耐朴。 經(jīng)常有香客問我借卧,道長,這世上最難降的妖魔是什么筛峭? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任铐刘,我火速辦了婚禮,結(jié)果婚禮上蜒滩,老公的妹妹穿的比我還像新娘滨达。我一直安慰自己奶稠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布捡遍。 她就那樣靜靜地躺著锌订,像睡著了一般。 火紅的嫁衣襯著肌膚如雪画株。 梳的紋絲不亂的頭發(fā)上辆飘,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音谓传,去河邊找鬼蜈项。 笑死,一個胖子當(dāng)著我的面吹牛续挟,可吹牛的內(nèi)容都是我干的紧卒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼诗祸,長吁一口氣:“原來是場噩夢啊……” “哼跑芳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起直颅,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤博个,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后功偿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盆佣,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年械荷,在試婚紗的時候發(fā)現(xiàn)自己被綠了共耍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡养葵,死狀恐怖征堪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情关拒,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布庸娱,位于F島的核電站着绊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏熟尉。R本人自食惡果不足惜归露,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斤儿。 院中可真熱鬧剧包,春花似錦恐锦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至堕油,卻和暖如春潘飘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掉缺。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工卜录, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人眶明。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓艰毒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搜囱。 傳聞我的和親對象是個殘疾皇子现喳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容