Как кешировать изображения только на диске с помощью Kingfisher?

Я использую Kingfisherбиблиотека для скачивания и кеширования изображений. Я сталкиваюсь с некоторыми проблемами в реализации:

  1. Кэшируются ли изображения в памяти и на диске?

  2. Есть ли возможность кэшировать изображения только на диске?

Я уже прочитал несколько сообщений об этом, но не смог найти никакого решения.

2 ответа

Решение

Да, Kingfisher кэширует изображения как в памяти, так и на диске.

По умолчанию объем ОЗУ, который будет использоваться, даже не ограничен, вы должны установить это значение самостоятельно:

ImageCache.default.maxMemoryCost = 1024 * 1024 * yourValue

где 1024 * 1024 * yourValue это глобальная стоимость в мегапикселях (я знаю, что это странно, но это не мегабайты, это мегапиксели, потому что изображения могут иметь разную разрядность и т. д.).

Например, в моих тестах максимальный объем ОЗУ, используемый со значением 1024 * 1024 * 500 колеблется между 120 МБ и 300 МБ.

Кстати, это также, как вы говорите Kingfisher никогда не использовать оперативную память и только кешировать на диск:

ImageCache.default.maxMemoryCost = 1

Это заставит Kingfisher использовать только дисковый кеш.


Как отлаживать

Прежде всего, убедитесь, что вы устанавливаете максимальное значение в правом кэше. Может быть, вы создали собственный кеш? Мой пример устанавливает значение для кэша по умолчанию, который используется, если не определено другое.

Вы также можете вручную очистить кэш-память и сравнить объем памяти до и после:

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)
                    }
                }

ссылка: https://github.com/onevcat/Kingfisher/wiki/Cheat-Sheet

Swift 5.1, Xcode 11.3

/questions/3264785/kak-keshirovat-izobrazheniya-tolko-na-diske-s-pomoschyu-kingfisher/3264796#3264796, последняя версия следующих

ImageCache.default.memoryStorage.config.totalCostLimit = 1 //1 in bytes
Другие вопросы по тегам