Kingfisher 默认缓存行为是什么?

What's the Kingfisher default cache behavior?

我正在使用 Kingfisher 库来缓存 UICollectionView 单元格中的图像。

我注意到调用 kf_setImage(假设单元格的名称称为 listCell,其 ImageView 称为 imgMain)如下:

listCell.imgMain.kf.setImage(with: URL(string: "MY IMAGE URL"),
                             placeholder: UIImage(named: "PLACEHOLDER IMAGE"))

工作正常,它确实缓存图像并在单元格重新出队时显示它(上下滚动时,我可以直接看到图像而无需重新下载),但是 当我拉动以刷新集合视图时(回想 API 具有完全相同的参数,这意味着它将 return 相同的图像 url)图像已重新下载!我假设图像已经被缓存了。

为了更清楚,this link 包含描述我所面对的情况的 gif 图片。

那么,为什么图片又被下载了一次?这是翠鸟缓存的默认行为吗?是否有任何配置需要编辑才能像我预期的那样运行?

我阅读了 library documentation,但 - 不幸的是 - 我找不到与我的要求相关的有用信息。

根据我之前看到的 Kingfisher 的行为,单元格的加载最初是获取图像并保存到缓存中。

每次滚动时,它都会处理图像的更改、重新加载、从缓存中获取等。在拉动刷新中,您正在重新加载数据源,因此 Kingfisher 会尝试再次重新加载缓存,当然,您可以避免使用 Kingfisher 手动处理缓存或在 kf_setImage 方法的选项中指定。

如果看到方法的签名kf_setImage:

public func kf_setImage(with resource: Resource?,
                          placeholder: Image? = nil,
                              options: KingfisherOptionsInfo? = nil,
                        progressBlock: DownloadProgressBlock? = nil,
                    completionHandler: CompletionHandler? = nil) -> RetrieveImageTask

默认有options参数nil。您可以在这些参数中指定 onlyFromCache,如果设置,Kingfisher 将只尝试从缓存中检索图像,而不是从网络中检索图像。

imageView.kf.setImage(with: url, options: [.onlyFromCache])

另一种方法,如果根据您的要求自定义 ImageCache and ImageDownloader

但是你需要小心,因为当你执行拉动刷新时,默认行为应该首先显示缓存中的图像并在它来自网络时更新它,所以你需要以某种方式处理它像这样。

希望对你有所帮助

Kingfisher 默认使用整个 url 作为缓存键,因此您必须确保每次请求 [=18] 时都具有完全相同的图像 url 字符串=].如果 url 后面附加了时间戳或版本号之类的东西,缓存就会失败。 (例如 http://example.com/image.png?time=123http://example.com/image.png?time=456 将被识别为两个不同的缓存键,尽管您可以从中获得相同的图像)。

这是我唯一能为你的手术画的病例。如果这对你来说是真的,你可以创建一个 ImageResource 来明确指定缓存键(这应该与你原来的 url 相关,但去掉附加的东西):

let r = ImageResource(downloadURL: yourUrl, cacheKey: key)
imageView.kf.setImage(with: r, placeholder: yourImage)