如果我多次调用tableView.reloadData会导致性能问题吗?

时间:2016-05-18 05:19:34

标签: ios swift uitableview

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

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

所以我做了这样的事情:

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个单元格。

3 个答案:

答案 0 :(得分:3)

如果您拥有单元格的indexPath

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

它可能对你有帮助。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

Apple提供Table View Programming Guide for iOS