Swift RunLoop 块 table 视图
Swift RunLoop blocks table view
所以,我有一个计时器,它每 0.1 秒在我的应用程序委托中将一个变量递增 1。在我的 tableViewController 中,我将这个数字显示在一个单元格中。在控制器中有另一个计时器可以重新加载可见单元格。一切正常,除了一旦滚动 table 视图,数字就会停止变化,直到 table 视图未被释放。我读到对此的修复是:
RunLoop.current.add(tableTimer, forMode: RunLoopMode.commonModes)
其中 tableTimer
是我的单元重新加载计时器。尽管如此,这仍然有效,但是一旦滚动浏览视图,它就会非常滞后并且像往常一样流畅度为 0%。任何修复?谢谢。
编辑:
创建计时器:
func scheduledTimerWithTimeInterval(){
reloadTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.reloadTV), userInfo: nil, repeats: true)
RunLoop.current.add(earningTimer, forMode: RunLoopMode.commonModes)
}
正在更新 table 视图:
@objc func reloadTV() {
self.tableView.beginUpdates()
self.tableView.reloadRows(at: self.tableView.indexPathsForVisibleRows!, with: .none)
self.tableView.endUpdates()
}
每 .1 秒为单元格中的标签重新加载一个 table 视图是非常愚蠢的。出于许多原因。解决此问题的最佳方法是遍历所有可见的索引路径,使用索引路径创建一个 cellForRowAtIndexPath,然后直接从那里修改单元格标题,方法如下:
@objc func reloadTV() {
for myIP in (tableView.indexPathsForVisibleRows) {
let cell = tableView.cellForRow(at: myIP)
cell.textLabel?.text = changingVariable
}
}
所以,我有一个计时器,它每 0.1 秒在我的应用程序委托中将一个变量递增 1。在我的 tableViewController 中,我将这个数字显示在一个单元格中。在控制器中有另一个计时器可以重新加载可见单元格。一切正常,除了一旦滚动 table 视图,数字就会停止变化,直到 table 视图未被释放。我读到对此的修复是:
RunLoop.current.add(tableTimer, forMode: RunLoopMode.commonModes)
其中 tableTimer
是我的单元重新加载计时器。尽管如此,这仍然有效,但是一旦滚动浏览视图,它就会非常滞后并且像往常一样流畅度为 0%。任何修复?谢谢。
编辑:
创建计时器:
func scheduledTimerWithTimeInterval(){
reloadTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.reloadTV), userInfo: nil, repeats: true)
RunLoop.current.add(earningTimer, forMode: RunLoopMode.commonModes)
}
正在更新 table 视图:
@objc func reloadTV() {
self.tableView.beginUpdates()
self.tableView.reloadRows(at: self.tableView.indexPathsForVisibleRows!, with: .none)
self.tableView.endUpdates()
}
每 .1 秒为单元格中的标签重新加载一个 table 视图是非常愚蠢的。出于许多原因。解决此问题的最佳方法是遍历所有可见的索引路径,使用索引路径创建一个 cellForRowAtIndexPath,然后直接从那里修改单元格标题,方法如下:
@objc func reloadTV() {
for myIP in (tableView.indexPathsForVisibleRows) {
let cell = tableView.cellForRow(at: myIP)
cell.textLabel?.text = changingVariable
}
}