ios - Kingfisher 默认缓存行为是什么?

标签 ios swift caching kingfisher

我正在使用 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=123http://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/

相关文章:

ios - 计算 Cox De Boor 算法的结向量的正确方法是什么?

ios - 为 ios 中的不同 View Controller 设置不同的标签栏外观

iOS/swift 4 : How to copy a folder containing several folders containing files without removing the files and folders existing destination?

Spring @Cacheable 不工作-我的配置有什么问题?

caching - 缓存大小的容量规划

javascript - Flux+React.js - 缓存 API 请求响应

objective-c - NSFileHandle 和将异步写入 iOS 中的文件

ios - 我可以在 NSURLSession 创建后更新其配置中的 cookie 吗?

ios - 快速制作播放列表(开始下一首歌曲)

ios - 如何使 UIBezierPath 从中心填充