不断更新 TableView 中单元格内的数据
Constantly update data inside cell in TableView
我需要不断更新单元格内的数据(它是 "published ago timer")。我可以在单元格内添加 NSTimer 事件,每秒将标签更新为实际数据,但我认为这会造成内存泄漏。
如您所知,当单元格未显示时,它不会加载到内存中,因此如果用户向下滚动,上方的单元格就会从内存中卸载。但是定时器会永久存在吗?
如果 cellView 从 view/memory 卸载,我可以 .invalidate()
计时器,但我不知道卸载 NSTableCellView(或 NSView)时调用什么函数。
在您的自定义单元格中,使用 deinit {}
使之无效。
此外,上层单元不会从内存中释放,而是在需要时取出。因此,请务必在自定义单元格的 prepareForReuse
中重置计时器(如果需要)。
不要将定时器放在单元格中,将一个定时器放入控制器中,这样可以更新所有可见单元格:
- (void)timerFired {
for (UITableViewCell *cell in self.tableView.visibleCells) {
[cell doNecessaryViewUpdate];
}
}
我找到了更新所有单元格中数据的方法(更改单元格的 class 名称和 table):
updateDateInCellsTimer = NSTimer.scheduledTimerWithTimeInterval(30, target: self, selector: "updateDateInCells", userInfo: nil, repeats: true)
func updateDateInCells() {
for var row = 0; row < tableView.numberOfRows; row++ {
guard let cell = tableView.viewAtColumn(0, row: row, makeIfNecessary: false) as? NSTableCellView else { continue }
// here you can do anything, cell is your cell reference
}
}
它适用于 NSTableView。如果要在iOS处使用(有UITableView),使用
我需要不断更新单元格内的数据(它是 "published ago timer")。我可以在单元格内添加 NSTimer 事件,每秒将标签更新为实际数据,但我认为这会造成内存泄漏。
如您所知,当单元格未显示时,它不会加载到内存中,因此如果用户向下滚动,上方的单元格就会从内存中卸载。但是定时器会永久存在吗?
如果 cellView 从 view/memory 卸载,我可以 .invalidate()
计时器,但我不知道卸载 NSTableCellView(或 NSView)时调用什么函数。
在您的自定义单元格中,使用 deinit {}
使之无效。
此外,上层单元不会从内存中释放,而是在需要时取出。因此,请务必在自定义单元格的 prepareForReuse
中重置计时器(如果需要)。
不要将定时器放在单元格中,将一个定时器放入控制器中,这样可以更新所有可见单元格:
- (void)timerFired {
for (UITableViewCell *cell in self.tableView.visibleCells) {
[cell doNecessaryViewUpdate];
}
}
我找到了更新所有单元格中数据的方法(更改单元格的 class 名称和 table):
updateDateInCellsTimer = NSTimer.scheduledTimerWithTimeInterval(30, target: self, selector: "updateDateInCells", userInfo: nil, repeats: true)
func updateDateInCells() {
for var row = 0; row < tableView.numberOfRows; row++ {
guard let cell = tableView.viewAtColumn(0, row: row, makeIfNecessary: false) as? NSTableCellView else { continue }
// here you can do anything, cell is your cell reference
}
}
它适用于 NSTableView。如果要在iOS处使用(有UITableView),使用