首先先簡(jiǎn)述一下此次reloadData()失效是基于一種怎樣的場(chǎng)景:
有A、B兩個(gè)頁(yè)面,A頁(yè)面是一個(gè)展示所有倒計(jì)時(shí)的列表頁(yè),B頁(yè)面是某個(gè)倒計(jì)時(shí)的詳情頁(yè),并且當(dāng)某個(gè)倒計(jì)時(shí)結(jié)束后間隔指定時(shí)間重新刷新該倒計(jì)時(shí),并同步到詳情頁(yè)B頁(yè)面。
關(guān)于cell倒計(jì)時(shí)的實(shí)現(xiàn)有興趣的小伙伴可以參考這篇文章,作者封裝了能夠?qū)崿F(xiàn)該功能的第三方庫(kù)以及對(duì)其實(shí)現(xiàn)思路也有詳細(xì)的講解,本篇提供的demo也是基于此第三方庫(kù)去實(shí)現(xiàn)的。
在需要倒計(jì)時(shí)的地方監(jiān)聽(tīng)通知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 = "開(kāi)獎(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ù)同步給詳情頁(yè)(如果詳情頁(yè)在當(dāng)前窗口中)
if WeakSelf!.detailVC != nil {
WeakSelf!.detailVC?.updateVc(model: model)
}
之前是把上述同步數(shù)據(jù)的代碼寫在cellForRow(at:)
里,每當(dāng)給cell賦值時(shí)再去判斷并同步數(shù)據(jù)。但是當(dāng)用戶停留在詳情頁(yè)時(shí),發(fā)現(xiàn)詳情頁(yè)的數(shù)據(jù)并沒(méi)有被更新。祭出斷點(diǎn)調(diào)試技能后發(fā)現(xiàn),執(zhí)行了reloadData程序僅執(zhí)行了tableView(_:numberOfRowsInSection:)
方法,而做同步數(shù)據(jù)的方法cellForRow(at:)
并沒(méi)有被執(zhí)行。
小朋友,你是否有很多問(wèn)號(hào),明明numberOfRowsInSection都已調(diào)用了,為什么cellForRowAt卻不執(zhí)行?
可能有些老司機(jī)們已經(jīng)發(fā)現(xiàn)了問(wèn)題是出在哪里,問(wèn)題就出在cellForRow(at:)
。看下蘋果官網(wǎng)文檔對(duì)于該方法的解釋
簡(jiǎn)言之就是該方法所在的視圖存在于活動(dòng)窗口中cellForRow(at:)才會(huì)被執(zhí)行。而此時(shí)用戶停留在了詳情頁(yè),但是cellForRow(at:)存在于A頁(yè)面中,所以數(shù)據(jù)沒(méi)有同步到B頁(yè)面。
而且cellForRow(at:)可能會(huì)執(zhí)行多次,所以把同步數(shù)據(jù)的代碼寫在該方法中也存在一定的合理性。
最后別忘了在適當(dāng)?shù)牡胤结尫拍銊?chuàng)建的定時(shí)器!