UITableView 单元格背景图像初始滚动滞后

UITableView Cell Background Images initial scroll lag

我有一个应用程序,其中有一个 table 视图严格从资产中提取单元格背景图像。我注意到由于将这些图像加载到 table 视图中,初始滚动时 fps 下降。 (如果我只是用黑框替换 UIImage 或提供所有相同的图像,则滚动是无缝的)。 table 视图中的所有图像首次加载后,滚动动作就没有延迟。

目前每张图片的大小在 1.8MB 到 3MB 之间。 3x 图像的纵横比约为 1125x295,1x 和 2x 设备的纵横比缩小。设置背景图像时也会调用 initial.scaleAspectFill,但我不知道这是否是问题所在。我发现 6s、X、ipad mini 和 pro.

存在这个问题
  1. 您建议背景图片的最大文件大小是多少?
  2. 如果我尝试在后台线程上拉取 UIImages,这是不允许的,因为 UIImages 需要在主线程上处理(xCode 错误)。
  3. 我是否应该尝试弄清楚如何预缓存这些图像?

这是设置背景图片的方法

fileprivate let backgroundImageView: UIImageView = {
    let view = UIImageView(axId: "backgroundImage")
    view.contentMode = .scaleAspectFill
    view.layer.masksToBounds = true
    return view
}()

在单元格的初始菜单中,backgroundImageView 作为子视图添加到 contentView

您可以执行 #2 从背景中提取图像。从 backgroundThread 加载图像到内存,然后通过 mainThread

分配它
    fileprivate let backgroundImageView: UIImageView = {
        let view = UIImageView()

        DispatchQueue.global().async {
            let image = getFromSource()

            DispatchQueue.main.async {
                view.image = image
                view.contentMode = .scaleAspectFill
                view.layer.masksToBounds = true
            }
        }

        return view
    }()

或者您可以使用 KingFisher 来缓存图像,它有自己的图像缓存方式。很整洁。

您可能还想实施 prepareForReuse,以便在要重新使用单元格时卸载以前的图像。

override func prepareForReuse() {
    super.prepareForReuse()

   //Do your clean up here
}