ios - 有效地更新 UITabelView 单元格

标签 ios swift performance uitableview signalr

我正在编写这个具有表格 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/

    相关文章:

    php - 出于角色目的,在每个 http 请求上使用现有表名创建 mysql View

    c# - 哪个性能更好

    c# - 使用 C# 发送电子邮件以在 iOS 中显示

    ios - 带有 UITableView Swift 3 的可折叠输入表单

    ios - 如何在Unity3d中制作覆盖360度的平面

    swift XCTest : Verify proper deallocation of weak variables

    ios - 无法使用命令行构建 iOS 项目,但可以通过 Xcode 界面构建

    swift - 如何使用 swift 查找给定月份和年份中的天数

    swift - Swift 字节中的 UDP 消息已读但无消息

    java - Java NIO 在阻塞模式下相对于传统 I/O 的优势?