【问题标题】:How to cache images only in disk using Kingfisher?如何使用 Kingfisher 仅在磁盘中缓存图像?
【发布时间】:2017-10-18 07:42:39
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios swift caching image-caching kingfisher


    【解决方案1】:

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

    【讨论】:

    • 如何查看图片是否还在内存中?我已经设置了 maxMemoryCost = 0,但内存仍然没有被释放。
    • 游戏这么晚了,但这是一种约定(不直观),即 0 = 无限制。用 Swift 编写的 API 应该使用带有相关值的枚举来实现这些目的。
    • 这不是真的。默认情况下,内存缓存的 totalCostLimit 为设备总内存的 25%,并且对图像数量没有限制。 github.com/onevcat/Kingfisher/wiki/…
    • @gafos 也许在我发布答案后它改变了?我不记得了,那是很久以前的事了。请随时使用正确的信息编辑我的答案。谢谢。
    【解决方案2】:

    如果有人在不使用 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

    【讨论】:

      【解决方案3】:

      Swift 5.3、Xcode 12

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

      ImageCache.default.memoryStorage.config.totalCostLimit = 1 //1 in bytes
      

      【讨论】:

        猜你喜欢
        • 2020-03-30
        • 2016-08-30
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        • 2015-08-18
        • 2017-06-15
        相关资源
        最近更新 更多