【问题标题】:Main thread blocking on scroll and Kingfisher setting the image滚动和翠鸟设置图像时的主线程阻塞
【发布时间】:2019-06-02 14:17:26
【问题描述】:

我一直在运行缓慢的滚动性能,我注意到当我滚动并使用非缓存图像调用 setImage 时,下载发生时性能滞后。

if let imageURL = URL(string: presentable.imageUrl) {
    let resource = ImageResource(downloadURL: imageURL)
    photoView.kf.setImage(with: resource, options: [.transition(.fade(0.2))])
}

我的理解是,Kingfisher 在后台线程上下载这些,然后在主线程上显示它们,但主线程似乎暂时被阻塞了。删除.transition 对这种情况没有帮助。

关于如何提高我的滚动性能的任何想法?谢谢

【问题讨论】:

  • 图像加载时滚动卡顿,然后继续。我只是使用 KF 开箱即用的 setImage 实现,没有自定义
  • 图像的大小是否适合图像视图或更大?我可以想象这可能会导致一些轻微的口吃......
  • 它可能更大。我无法控制图像大小,它是用户生成的内容
  • 是的,但您可以在后台调整大小。但令我惊讶的是,KingFisher 的下载导致了问题,因为这就是它的全部存在理由。
  • 这是我的想法。让我先尝试调整大小,然后将其提供给 KF

标签: ios swift kingfisher


【解决方案1】:

当图像大于图像视图时,iOS 需要操作较大的 UIImage 对象,这可能会导致 UI 出现明显的卡顿。如果您适当地调整图像大小(在后台线程中),它可以解决这个问题。

幸运的是,Kingfisher 有一个处理器可以为您做到这一点。正如Cheat Sheet 所说:

DownsamplingImageProcessor 用于高分辨率图像

考虑一下我们想在表格视图或集合视图中显示一些大图像的情况。在理想的世界中,我们希望为它们获得更小的缩略图,以减少下载时间和内存使用。但在现实世界中,也许您的服务器并没有为您准备这样的缩略图版本。新添加的DownsamplingImageProcessor 救援。它在加载到内存之前将高分辨率图像下采样到一定大小:

imageView.kf.setImage(
    with: resource,
    placeholder: placeholderImage,
    options: [
        .processor(DownsamplingImageProcessor(size: imageView.size)),
        .scaleFactor(UIScreen.main.scale),
        .cacheOriginalImage
    ])

通常,DownsamplingImageProcessor.scaleFactor.cacheOriginalImage 一起使用。它为您的 UI 提供了合理的图像像素比例,并通过缓存原始高分辨率图像来防止将来下载。

我用小图像创建了一个小测试并确认它是丝般光滑的,但是当我使用大图像时,我在滚动行为中遇到了卡顿。但是当我在大图场景中添加了这个DownsamplingImageProcessor时,它又变得如丝般顺滑了。

【讨论】:

  • 在我的情况下确实如此......我们不应该加载大于容器的图像。
  • 是的,我们不应该加载大于容器倍于该设备规模的图像(例如,在 3× 设备上的 100×100 pt 图像视图,应该使用 300×300 像素的图像)。
  • 内容模式有时也很重要,请查看我的答案...
【解决方案2】:

更新

self.imageView.contentMode = .scaleAspectFill

self.imageView.contentMode = .scaleAspectFit

为我做了诀窍。

我在UITableViewCell 中嵌入了UICollectionView。每个UICollectionViewCell 都有一个图像视图,它使用 Kingfisher 从 URL 加载图像。我的表格视图滚动很生涩,我尝试了不同的方法,包括不绑定模型和为每个单元格设置数据。但没有任何区别。一旦我更改了图像视图的内容模式,它现在滚动非常流畅。

根据 Rob 的回答,即使图像尺寸较小(在我的情况下甚至是 480 x 320),也可能需要将模式设置为 .scaleAspectFill 来进行一些处理。将模式更新为.scaleAspectFit 后,即使是大尺寸图片也能流畅滚动。

【讨论】:

  • 有什么想法为什么有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
相关资源
最近更新 更多