我正在编写这个具有表格 View 的应用程序,显示有关股票市场的数据。该应用程序使用 SignalR ( this lib ) 实时更新数据。每个表格 View 单元格都有 10 个标签,代表有关相应仪器的一些信息。
正如我所说,该应用程序实时运行,有时每秒会获得多达 20 次更新,这些更新需要出现在 UI 上。每个 SignalR 通知都包含一个字符串,在解析它之后我知道需要更新哪一行以及该行上的哪些标签(并非每次都更改所有标签)。
问题是:以下哪种方式性能更好?
self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None)
let indexPath = NSIndexPath(forRow: i, inSection: 0)
let cell = self.tableView.cellForRowAtIndexPath(indexPath)!
if self.watch[i]["bestBidQuantity"].string != list[3] {
let bestBidQuantityLabel = cell.viewWithTag(7) as! UILabel
bestBidQuantityLabel.text = StringManipulation.localizeDecimalNumber(Int64(list[3])!)
}
需要注意的一件重要事情是有问题的单元格在更新时可能不可见。据我所知,调用 reloadRowsAtIndexPaths
仅在该行可见时更新该行,但我不确定关于 View 单元格外的第二个解决方案。
最佳答案
我不确定您为什么担心更新不在屏幕上的单元格?如果您在 cellForRowAtIndexPath: 中出列一个单元格(正如您应该做的那样),您的单元格将被出列并在需要时使用正确的信息(来自您的模型)进行设置。
当您收到 SignalR 通知时,根据通知更新您的模型。当用户滚动时,一个单元格将出列并使用模型中的最新信息进行设置。
对于已经在 View 中的单元格,我喜欢第二个选项,但仍然会在单元格离开屏幕并需要重新设置时更新模型。
您还没有创建 UITableViewCell 子类吗?我建议使用带有 IBOutlets 的子类而不是 viewWithTag。然后,您可以在单元格子类中包含一个函数来更新它的 UI 组件。像这样的 -
class StockCell: UITableViewCell
{
@IBOutlet weak var bestBidQuantityLabel: UILabel?
func update(notification: SignalIR) {
bestBidQuantityLabel?.text = notification.bestBidQuantity
}
}
当您收到新通知时,您可以这样做:
updateModel(notification)
if let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: ..., inSection: ...)) as? StockCell {
cell.update(notification)
}
您还可以重复使用 update(...) 函数从 cellForRowAtIndexPath 设置单元格:
关于ios - 有效地更新 UITabelView 单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36475227/