iOS cell中的倒计时以及reloadData“失效”的情形
2020-03-26 本文已影响0人
TMMMMMS
首先先简述一下此次reloadData()失效是基于一种怎样的场景:
有A、B两个页面,A页面是一个展示所有倒计时的列表页,B页面是某个倒计时的详情页,并且当某个倒计时结束后间隔指定时间重新刷新该倒计时,并同步到详情页B页面。
CountDow.gif
关于cell倒计时的实现有兴趣的小伙伴可以参考这篇文章,作者封装了能够实现该功能的第三方库以及对其实现思路也有详细的讲解,本篇提供的demo也是基于此第三方库去实现的。
在需要倒计时的地方监听通知OYCountDownNotification,在通知里处理倒计时文本的改变以及倒计时停止后通知控制器做重新获取倒计时的操作。
@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 { // 倒计时结束时回调
countdownLabel.text = "开奖中"
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)
}
}
获取到新的倒计时信息之后刷新列表,并且把数据同步给详情页(如果详情页在当前窗口中)
if WeakSelf!.detailVC != nil {
WeakSelf!.detailVC?.updateVc(model: model)
}
之前是把上述同步数据的代码写在cellForRow(at:)
里,每当给cell赋值时再去判断并同步数据。但是当用户停留在详情页时,发现详情页的数据并没有被更新。祭出断点调试技能后发现,执行了reloadData程序仅执行了tableView(_:numberOfRowsInSection:)
方法,而做同步数据的方法cellForRow(at:)
并没有被执行。
小朋友,你是否有很多问号,明明numberOfRowsInSection都已调用了,为什么cellForRowAt却不执行?
可能有些老司机们已经发现了问题是出在哪里,问题就出在cellForRow(at:)
。看下苹果官网文档对于该方法的解释
简言之就是该方法所在的视图存在于活动窗口中cellForRow(at:)才会被执行。而此时用户停留在了详情页,但是cellForRow(at:)存在于A页面中,所以数据没有同步到B页面。
而且cellForRow(at:)可能会执行多次,所以把同步数据的代码写在该方法中也存在一定的合理性。
最后别忘了在适当的地方释放你创建的定时器!