【问题标题】:Unusual high CPU usage in UITableViewUITableView 异常高的 CPU 使用率
【发布时间】:2017-08-21 14:22:45
【问题描述】:

我正在创建一个锻炼应用程序,并创建了一个 UITableview 来显示所有可用的练习(大约 120 个)。我正在使用 NSFetchedResultsController 从 CoreData 获取数据。我遇到的问题是,当我滚动表格时,我的 CPU 使用率非常高。它的范围从 50%-100% 取决于我滚动的速度。

这是我的行单元格:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? ExerciseCell else {fatalError("Couldn't load appropriate index path for custom cell")}

     let exercise = self.fetchedResultsController.object(at: indexPath)
     cell.exerciseTitle.text = exercise.name

     if let getImage = exercise.image2 {
            let image = UIImage(data: getImage as Data)

                cell.exerciseImage.image = image

        } else {
            cell.exerciseImage.image = nil
        }

    return cell
}

我不确定这是否与我转换图像的方式有关?或者我如何设置我的 CoreData?任何帮助都是极好的。谢谢。

【问题讨论】:

  • 我怀疑重复调用UIImage(data: 非常昂贵。如果这是我的代码,我可能会尝试获取保存在 CoreData 中的所有练习的图像并将它们缓存在某个地方以便快速重用/重新加载。也许在显示 tableview 之前?

标签: swift xcode uitableview core-data


【解决方案1】:

看起来你可能在 UIImage 上做昂贵的工作。

为了实现无缝滚动,您应该遵循一些准则。

一个经验法则:尽量使tableView:cellForRowAtIndexPath 方法尽可能快地返回单元格实例

  • 线程:尝试在后台线程而不是主线程 ex 中进行获取或任何计算。在这里你正在创建 UIImage 实例
  • 渲染:不要在tableView:cellForRowAtIndexPath 中执行数据绑定,而是在tableView:willDisplayCell:forRowAtIndexPath 中执行步骤
  • 动画:一些令人大开眼界的核心图形性能问题。参考这个:http://asyncdisplaykit.org/docs/corner-rounding.html
  • 缓存:创建自己的有效缓存机制。 IE。
    • 访问 coreData 结果的更好方法,以便之后可以快速访问它
    • 单元格的高度计算
  • 对于动态高度单元格,不要使用绑定数据初始化单元格实例来获取它们的高度,而是使用基于传递的宽度和要显示的数据返回高度的类方法(单元格适配器)

【讨论】:

    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    相关资源
    最近更新 更多