【问题标题】:Will it cause performance issues if I call tableView.reloadData a lot of times?如果我多次调用 tableView.reloadData 会导致性能问题吗?
【发布时间】:2016-09-14 10:09:59
【问题描述】:

我只想非常优雅地在表格视图中添加和删除行。所以我问了这个question。但我不认为答案能回答我的问题。

然后我想我可以创建一个UITableViewCells 的数组并将其用作数据源!

所以我做了这样的事情:

class MyTableViewController: UITableViewController {
    var cells = [[UITableViewCell]]()

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return cells.count
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return cells[section].count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        return cells[indexPath.section][indexPath.row]
    }

    func addCellToSection(section: Int, cell: UITableViewCell) {
        cells[section].append(cell)
        tableView.reloadData()
    }

    func removeCellFromSection(section: Int, index: Int) {
        cells[section].removeAtIndex(index)
        tableView.reloadData()
    }
}

现在我可以调用removeCellFromSectionaddCellToSection 来添加和删除单元格。多么优雅!

但是,我不确定是否一直拨打tableView.reloadData() 会降低应用程序的速度。每次我添加或删除一个单元格时,表格视图中的每个单元格都需要刷新。那会是很多工作,对吧?

所以一直调用tableView.reloadData() 会显着降低我的应用程序的速度吗?如果是,有什么可以替代的?如果没有,为什么不呢?

附加信息:

最初,表格视图包含 4 个单元格。用户可以通过按下按钮添加单元格和删除单元格。平均而言,用户将添加少于 50 个单元格。

【问题讨论】:

  • 是的,会很慢。
  • 当然,它会很慢,而且你不能指望平滑的tableview滚动,如果你多次重新加载数据。
  • @ShangariC 那么还有其他选择吗?
  • 因此,如果您有类似的单元格,那么您执行错误,这就是为什么我们使用 reuseIdentifier 来更新具有所需值的单元格,而不是创建或保留大量单元格...保持单元格在一个数组仍然将它们保存在内存中......而不是将所需的数据保存在一个数组中以区分单元格并在可以在cellForRowAtIndexPath 中重用的单元格中更新它们
  • 不要创建单元格数组。创建要在单元格中使用的数据数组并将其用作数据源。处理cellForRowAtIndexPath 中的单元格自定义,TableView 将负责显示、隐藏、滚动、刷新单元格。 TableView 重用单元格,因此您的内存使用将非常合理。你不必自己做。并且一定要查找关于 TableViews 的好教程。

标签: ios swift uitableview


【解决方案1】:

是的,reloadData 会降低其性能。根据Apple's Documentation,当调用 reload 方法时,所有用于构造表格的数据,包括单元格、节页眉和页脚、索引数组等都会更新和重新加载。所以当需要更新数据或视图时,我们应该调用这个方法。为了提高效率,表格视图只重新显示那些可见的行。如果表因重新加载而缩小,它会调整偏移量。表视图的委托或数据源在它希望表视图完全重新加载其数据时调用此方法。不应在插入或删除行的方法中调用它,尤其是在通过调用 beginUpdates 和 endUpdates 实现的动画块中。

【讨论】:

    【解决方案2】:

    如果你有你的单元格的 indexPath

    [self.tableView beginUpdates];
    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates]; 
    

    也许对你有帮助。

    【讨论】:

    • 我现在得走了,所以我稍后再试试。谢谢!
    • 等等。我有个问题。如果我删除一个单元格,我应该重新加载哪个索引路径?
    【解决方案3】:

    是的,它会很慢。此外,如果您自己存储UITableViewCells,它将使用比必要更多的内存,因为您将同时存储数据和单元格实例。 UITableView 编程系统旨在为您完成大量工作,但它确实有一个学习曲线。

    此外,添加和删除表格行的机制很优雅,但是,就像我说的,确实有一个学习曲线。

    苹果提供Table View Programming Guide for iOS

    【讨论】:

      猜你喜欢
      • 2021-06-23
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多