首先先簡述一下此次reloadData()失效是基于一種怎樣的場景:
有A、B兩個(gè)頁面,A頁面是一個(gè)展示所有倒計(jì)時(shí)的列表頁蚤告,B頁面是某個(gè)倒計(jì)時(shí)的詳情頁,并且當(dāng)某個(gè)倒計(jì)時(shí)結(jié)束后間隔指定時(shí)間重新刷新該倒計(jì)時(shí)服爷,并同步到詳情頁B頁面杜恰。
關(guān)于cell倒計(jì)時(shí)的實(shí)現(xiàn)有興趣的小伙伴可以參考這篇文章获诈,作者封裝了能夠?qū)崿F(xiàn)該功能的第三方庫以及對(duì)其實(shí)現(xiàn)思路也有詳細(xì)的講解,本篇提供的demo也是基于此第三方庫去實(shí)現(xiàn)的心褐。
在需要倒計(jì)時(shí)的地方監(jiān)聽通知OYCountDownNotification舔涎,在通知里處理倒計(jì)時(shí)文本的改變以及倒計(jì)時(shí)停止后通知控制器做重新獲取倒計(jì)時(shí)的操作。
@objc private func countDownNotification() {
let intervalModel = OYCountDownManager.sharedManager.timeIntervalDict[self.model!.identifier]
if intervalModel == nil {
return
}
let timeInterval = OYCountDownManager.sharedManager.timeIntervalWithIdentifier(identifier: self.model!.identifier)
let countDown = self.model!.interVal - timeInterval
if countDown <= 0 { // 倒計(jì)時(shí)結(jié)束時(shí)回調(diào)
countdownLabel.text = "開獎(jiǎng)中"
if self.delegate != nil {
self.delegate?.countdownEnd(model: self.model!)
}
} else {
countdownLabel.text = String(format: "%02d:%02d:%02d", countDown/3600, (countDown/60)%60, countDown%60)
}
}
獲取到新的倒計(jì)時(shí)信息之后刷新列表逗爹,并且把數(shù)據(jù)同步給詳情頁(如果詳情頁在當(dāng)前窗口中)
if WeakSelf!.detailVC != nil {
WeakSelf!.detailVC?.updateVc(model: model)
}
之前是把上述同步數(shù)據(jù)的代碼寫在cellForRow(at:)
里亡嫌,每當(dāng)給cell賦值時(shí)再去判斷并同步數(shù)據(jù)。但是當(dāng)用戶停留在詳情頁時(shí)掘而,發(fā)現(xiàn)詳情頁的數(shù)據(jù)并沒有被更新挟冠。祭出斷點(diǎn)調(diào)試技能后發(fā)現(xiàn),執(zhí)行了reloadData程序僅執(zhí)行了tableView(_:numberOfRowsInSection:)
方法袍睡,而做同步數(shù)據(jù)的方法cellForRow(at:)
并沒有被執(zhí)行知染。
小朋友,你是否有很多問號(hào)斑胜,明明numberOfRowsInSection都已調(diào)用了控淡,為什么cellForRowAt卻不執(zhí)行?
可能有些老司機(jī)們已經(jīng)發(fā)現(xiàn)了問題是出在哪里止潘,問題就出在cellForRow(at:)
掺炭。看下蘋果官網(wǎng)文檔對(duì)于該方法的解釋
簡言之就是該方法所在的視圖存在于活動(dòng)窗口中cellForRow(at:)才會(huì)被執(zhí)行凭戴。而此時(shí)用戶停留在了詳情頁涧狮,但是cellForRow(at:)存在于A頁面中,所以數(shù)據(jù)沒有同步到B頁面簇宽。
而且cellForRow(at:)可能會(huì)執(zhí)行多次勋篓,所以把同步數(shù)據(jù)的代碼寫在該方法中也存在一定的合理性。
最后別忘了在適當(dāng)?shù)牡胤结尫拍銊?chuàng)建的定時(shí)器魏割!