11

我正在使用Kingfisher库来下载和缓存图像。我在实施中面临一些问题:

  1. 图像是否同时缓存在内存和磁盘中?

  2. 是否有任何规定仅在磁盘上缓存图像?

我已经阅读了有关此的多个帖子,但找不到任何解决方案。

4

3 回答 3

20

是的,Kingfisher 将图像缓存在内存和磁盘中。

默认情况下,将使用的 RAM 量甚至没有限制,您必须自己设置值:

ImageCache.default.maxMemoryCost = 1024 * 1024 * yourValue

百万像素的全球成本在哪里1024 * 1024 * yourValue(我知道这很奇怪,但不是百万字节,而是百万像素,因为图像可以具有不同的位深度等)。

例如,在我的测试中,使用的最大 RAM 值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)
}
于 2017-06-04T13:06:16.590 回答
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

于 2018-05-31T10:31:49.593 回答
5

斯威夫特 5.3,Xcode 12

https://stackoverflow.com/a/44354411/10579134,最新版本如下

ImageCache.default.memoryStorage.config.totalCostLimit = 1 //1 in bytes
于 2020-02-24T08:54:36.300 回答