我正在使用 Kingfisher用于在 UICollectionView 单元格中缓存图像的库。
我注意到调用 kf_setImage
(假设cell的名字叫listCell
,它的ImageView叫imgMain
)如下:
listCell.imgMain.kf.setImage(with: URL(string: "MY IMAGE URL"),
placeholder: UIImage(named: "PLACEHOLDER IMAGE"))
工作正常,它确实缓存图像并在单元格重新出队时显示它(上下滚动时,我可以直接看到图像而无需重新下载),但是当我拉动以刷新 Collection View (回想一下具有完全相同参数的 API,这意味着它将返回相同的图像 url)图像已重新下载!我假设图像已经被缓存。
为了更清楚,this link包含描述我所面临的情况的 gif 图像。
那么,为什么图像会再次下载?这是翠鸟缓存的默认行为吗?是否应编辑任何配置以按我预期的方式运行?
我读了library documentation ,但 - 不幸的是 - 我无法找到与我的要求相关的有用信息。
最佳答案
Kingfisher 默认使用整个 url 作为缓存键,因此您必须确保每次请求 API 时图像的 url 字符串都相同。如果 url 中附加了时间戳或版本号之类的内容,缓存将失败。 (例如 http://example.com/image.png?time=123
和 http://example.com/image.png?time=456
将是被识别为两个不同的缓存键,尽管您可以从中获得相同的图像)。
这是我能为您的手术绘制的唯一案例。如果这对你来说是真的,你可以创建一个 ImageResource
来明确指定缓存键(它应该与你的原始 url 相关,但去掉附加的东西):
let r = ImageResource(downloadURL: yourUrl, cacheKey: key)
imageView.kf.setImage(with: r, placeholder: yourImage)
关于ios - Kingfisher 默认缓存行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43049041/