如何使用Kingfisher仅在磁盘缓存图像?

11

我正在使用Kingfisher库来下载和缓存图片。在实现过程中遇到了一些问题:

  1. 图片是同时被缓存在内存和磁盘中吗?

  2. 是否有仅将图片缓存在磁盘上的选项?

我已经阅读了多篇相关文章,但没有找到任何解决方案。

3个回答

22

是的,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)
}

我们如何检查图像是否仍存储在内存中?我已将maxMemoryCost设置为0,但内存仍未被释放。 - PGDev
游戏进行得这么晚了,但是0等于无限是一种(不直观的)约定俗成。使用Swift编写的API应该利用关联值枚举来实现这些目的。 - Ahmed Khalaf
这是不正确的。默认情况下,内存缓存的totalCostLimit是设备总内存的25%,而图像数量没有限制。https://github.com/onevcat/Kingfisher/wiki/Cheat-Sheet#set-limit-for-cache - gafos
@gafos 可能是我回答后发生了变化?我记不清了,那是很久以前的事了。请随意编辑我的回答,提供正确的信息。谢谢。 - Eric Aya

8

如果有人想要下载图像并缓存它,而不使用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)
                    }
                }

参考资料:https://github.com/onevcat/Kingfisher/wiki/Cheat-Sheet

这是一个关于it技术的wiki页面,提供了有关Kingfisher的相关技术知识和使用方法。如果您对Kingfisher感兴趣或需要使用它,请查看该页面获取更多信息。

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接