【发布时间】:2017-10-18 07:42:39
【问题描述】:
我正在使用 Kingfisher 库来下载和缓存图像。我在实施中遇到了一些问题:
图像是否同时缓存在内存和磁盘中?
是否有任何规定只在磁盘上缓存图像?
我已经阅读了多篇关于此的帖子,但找不到任何解决方案。
【问题讨论】:
标签: ios swift caching image-caching kingfisher
我正在使用 Kingfisher 库来下载和缓存图像。我在实施中遇到了一些问题:
图像是否同时缓存在内存和磁盘中?
是否有任何规定只在磁盘上缓存图像?
我已经阅读了多篇关于此的帖子,但找不到任何解决方案。
【问题讨论】:
标签: ios swift caching image-caching kingfisher
是的,Kingfisher 将图像缓存在内存和磁盘中。
默认情况下,将使用的RAM数量甚至没有限制,您必须自己设置值:
ImageCache.default.maxMemoryCost = 1024 * 1024 * yourValue
其中1024 * 1024 * yourValue 是以百万像素为单位的全球成本(我知道这很奇怪,但它不是百万字节,而是百万像素,因为图像可以有不同的位深度等)。
例如,在我的测试中,使用 1024 * 1024 * 500 值的最大 RAM 在 120MB 和 300MB 之间波动。
顺便说一句,这也是您告诉 Kingfisher 永远不要使用 RAM 而只缓存到磁盘的方式:
ImageCache.default.maxMemoryCost = 1
这将强制 Kingfisher 仅使用磁盘缓存。
如何调试
首先要检查您是否在正确的缓存上设置了最大值。也许您确实创建了自定义缓存?我的示例是设置默认缓存的值,如果未定义其他缓存,则使用该值。
你可能还想手动清空内存缓存,对比一下前后的RAM占用情况:
ImageCache.default.clearMemoryCache()
如果您认为内存缓存中不应该存在一些大图像,您可以通过isImageCached 进行验证:
if let result = ImageCache.default.isImageCached(forKey: imageLink) {
print(result.cached)
print(result.cacheType)
}
【讨论】:
如果有人在不使用 imageView 的情况下寻找明确下载图像并缓存相同图像的答案,示例代码是:
ImageDownloader.default.downloadImage(with: imgUrl, retrieveImageTask: nil, options: [], progressBlock: nil) { (image, error, url, data) in
print("Downloaded Image: \(url)")
//cache image:
if let image = image, let url = url {
ImageCache.default.store(image, forKey: url.absoluteString)
}
}
【讨论】:
Swift 5.3、Xcode 12
https://stackoverflow.com/a/44354411/10579134,最新版本如下
ImageCache.default.memoryStorage.config.totalCostLimit = 1 //1 in bytes
【讨论】: