Как кешировать изображения только на диске с помощью Kingfisher?
Я использую Kingfisher
библиотека для скачивания и кеширования изображений. Я сталкиваюсь с некоторыми проблемами в реализации:
Кэшируются ли изображения в памяти и на диске?
Есть ли возможность кэшировать изображения только на диске?
Я уже прочитал несколько сообщений об этом, но не смог найти никакого решения.
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