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=123
和 http://example.com/image.png?time=456
将被识别为两个不同的缓存键,尽管您可以从中获得相同的图像)。
这是我唯一能为你的手术画的病例。如果这对你来说是真的,你可以创建一个 ImageResource
来明确指定缓存键(这应该与你原来的 url 相关,但去掉附加的东西):
let r = ImageResource(downloadURL: yourUrl, cacheKey: key)
imageView.kf.setImage(with: r, placeholder: yourImage)
我正在使用 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=123
和 http://example.com/image.png?time=456
将被识别为两个不同的缓存键,尽管您可以从中获得相同的图像)。
这是我唯一能为你的手术画的病例。如果这对你来说是真的,你可以创建一个 ImageResource
来明确指定缓存键(这应该与你原来的 url 相关,但去掉附加的东西):
let r = ImageResource(downloadURL: yourUrl, cacheKey: key)
imageView.kf.setImage(with: r, placeholder: yourImage)