我正在使用Kingfisher
库来下载和缓存图片。在实现过程中遇到了一些问题:
图片是同时被缓存在内存和磁盘中吗?
是否有仅将图片缓存在磁盘上的选项?
我已经阅读了多篇相关文章,但没有找到任何解决方案。
我正在使用Kingfisher
库来下载和缓存图片。在实现过程中遇到了一些问题:
图片是同时被缓存在内存和磁盘中吗?
是否有仅将图片缓存在磁盘上的选项?
我已经阅读了多篇相关文章,但没有找到任何解决方案。
是的,Kingfisher会将图片缓存在内存和磁盘上。
默认情况下,将要使用的内存量甚至没有限制,您需要自己设置此值:
ImageCache.default.maxMemoryCost = 1024 * 1024 * yourValue
其中1024 * 1024 * yourValue
是以兆像素为单位的全局成本(我知道这很奇怪,但它不是以兆字节为单位,而是以兆像素为单位,因为图像可以具有不同的位深度等)。
例如,在我的测试中,当值为1024 * 1024 * 500
时,最大使用的内存波动在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)
}
}
这是一个关于it技术的wiki页面,提供了有关Kingfisher的相关技术知识和使用方法。如果您对Kingfisher感兴趣或需要使用它,请查看该页面获取更多信息。Swift 5.3, Xcode 12
https://dev59.com/mVcP5IYBdhLWcg3wqLow#44354411 ,以下是最新版本的相关内容
ImageCache.default.memoryStorage.config.totalCostLimit = 1 //1 in bytes