我正在编写这个具有表格视图的应用程序,显示有关股票市场的数据。该应用程序使用SignalR(this lib)实时更新数据。每个表格视图单元格都有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
只会在行可见时更新行,但我不确定我的第二个解决方案是否在视图单元格之外。
答案 0 :(得分:1)
我不确定为什么你担心更新不在屏幕上的细胞?如果您在cellForRowAtIndexPath:中出列了一个单元格(如您所愿),则您的单元格将在需要时出列并使用正确的信息(来自您的模型)进行设置。
当您收到SignalR通知时,请从通知中更新您的模型。当用户滚动时,单元格将出列并使用模型中的最新信息进行设置。
对于已经在视图中的单元格,我喜欢第二个选项,但是当单元格离开屏幕并且需要再次设置时,仍然会更新模型。
您是否还没有创建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设置单元格: