【问题标题】:Improve perfomance when scrolling UITableView with custom cells使用自定义单元格滚动 UITableView 时提高性能
【发布时间】:2016-11-11 06:19:32
【问题描述】:

我有一个UITableView,其中单元格是自定义的,并且单元格有一个带有图表的视图(Charts 库)。图表的数据非常大(它存储为 Controller 的属性),它会在几秒钟内出现。

我还在自定义 TableViewCell 类中的 setSelected 方法中进行了一些图表视图设置(只有很少的 UI 更改)

滚动表格视图时会出现一些滞后。我想这是因为我想显示大量内容。

在解决这个问题的过程中,我想到了四个解决方案:

  1. 加载ViewDidAppear中的所有单元格,将它们保存到数组中,在CellForRowAt方法中显示该数组中的单元格。

  2. 将表格视图放入滚动视图,使内容的高度相当大以适合表格视图中的所有单元格。

  3. 仅在单元格加载并显示其内容视图后才加载图表。在图表加载时显示活动指示器。

  4. 将图表的加载放在后台线程中。

在我看来,前两种方法在内存管理方面不太好。但我不确定,也许有我不知道的通用解决方案。

项目中的一些代码示例:

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let graphCell = tableView.dequeueReusableCell(withIdentifier: Cells.graphViewCell) as! GraphViewCell

    graphCell.lineChartView.data = track.chartDataForHeight()
    return graphCell
}

这里的track 是变量,我在其中存储图表数据。

【问题讨论】:

  • 主线程上的大量 UI 更新会影响 tableviewscroll。所以你的第 3 种方法会很好。第 4 种方法会有问题,因为所有 UI 更新都应该在主线程中完成

标签: ios swift uitableview ios-charts


【解决方案1】:

如果您有一个非常复杂的单元格并且数量不多,并且您不想每次都花钱创建它,那么不使用 dequeResuableCell 并只是懒惰地创建单元格并缓存它们是正确的。您可以通过响应 didReceiveMemoryWarning 并转储屏幕外单元格然后懒惰地重新创建它们来缓解内存问题。 UICollectionView 现在在 ios 10 中有prefetching。你也可以尝试使用它来代替 UITableView。

【讨论】:

    猜你喜欢
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多