有效地更新UITabelView单元格

时间:2016-04-07 11:45:19

标签: ios swift performance uitableview signalr

我正在编写这个具有表格视图的应用程序,显示有关股票市场的数据。该应用程序使用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只会在行可见时更新行,但我不确定我的第二个解决方案是否在视图单元格之外。

  • 1 个答案:

    答案 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设置单元格: