Как очистить память и кеш диска для изображений, загруженных с помощью Kingfisherin UITableView?

Мне нужно освободить всю память, занятую изображениями, загруженными с помощью Kingfisher. У меня есть UITableView, в котором хранится много изображений, а также функция «Загрузить больше».

Я попробовал эти меры.

В viewDidLoad() я устанавливаю размер кеша.

let cache = KingfisherManager.sharedManager.cache
cache.maxMemoryCost = 50 * 1024 * 1024
// Set max disk cache to 50 mb. Default is no limit.
cache.maxDiskCacheSize = 50 * 1024 * 1024
// Set max disk cache to duration to 3 days, Default is 1 week.
cache.maxCachePeriodInSecond = 60 * 60 * 24 * 3

В viewWillDisappear() я очищаю это.

cache.clearMemoryCache()
// Clear disk cache. 
cache.clearDiskCache()
// Clean expired or size exceeded disk cache.
cache.cleanExpiredDiskCache()

Тем не менее память не освобождается, как ожидалось. Пожалуйста, поправьте меня, если я что-то упустил.


person Ankit Kumar Gupta    schedule 23.11.2016    source источник


Ответы (5)


Получив предупреждение о памяти, я очистил кеш, и теперь он работал нормально:

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    cache.clearMemoryCache()
    cache.clearDiskCache()
    cache.cleanExpiredDiskCache()
}

Обновление для Swift 4:

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    KingfisherManager.shared.cache.clearMemoryCache()
    KingfisherManager.shared.cache.clearDiskCache()
    KingfisherManager.shared.cache.cleanExpiredDiskCache()
}
person Ankit Kumar Gupta    schedule 08.06.2017

KingFisher в Swift 4

KingfisherManager.shared.cache.clearMemoryCache()
KingfisherManager.shared.cache.clearDiskCache()
KingfisherManager.shared.cache.cleanExpiredDiskCache()
person Chhaileng    schedule 12.09.2018

Согласно документации:

Kingfisher будет очищать кеш памяти при получении предупреждения о памяти, а также очищать кеш с истекшим сроком действия и размером, когда это необходимо. Обычно нет необходимости чистить кеш самостоятельно. Эти методы существуют на случай, если вы хотите, чтобы ваши пользователи имели больший контроль над кешем.

person DoesData    schedule 09.09.2017

Swift 5, вы можете заменить 3 строки только одной.

KingfisherManager.shared.cache.clearCache()
person MMDev11070    schedule 14.12.2020

Удалить изображения из кеша вручную

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

KingfisherManager.shared.default.cache.removeImage(forKey: cacheKey)

Или, с большим контролем:

KingfisherManager.shared.default.cache.removeImage(
    forKey: cacheKey,
    processorIdentifier: processor.identifier,
    fromMemory: false,
    fromDisk: true)
{
    print("Removed!")
}
person Shamseer Ali    schedule 31.12.2020