Очистка кеша SDWebImage

Я показываю список значков, загруженных из Интернета, с текстом в виде таблицы. Значки можно изменить на стороне сервера, и мне нужно заменить их, как только появятся новые значки. Я пытаюсь использовать следующий код:

[imgView setImageWithURL:url placeholderImage:[UIImage imageNamed:@"table_avatar_icon"] options:SDWebImageCacheMemoryOnly];

И вызовите [[SDImageCache sharedImageCache] clearMemory]; в моем обратном вызове обновления, но он не очищает содержимое кеша. Более того, даже если я закрою приложение и снова открою его, изображение все еще там.

Я нашел только один способ очистить кеш, и это вызов [[SDImageCache sharedImageCache] clearDisk];. Который работает только после того, как я закрою и снова открою приложение.

Как я могу заставить SDWebImage не использовать кэширование диска?


person Eugene    schedule 13.12.2012    source источник
comment
Для всех людей, которые просто хотят каждый раз повторно загружать некоторые изображения, передайте SDWebImageRefreshCached в опции   -  person Eugene    schedule 10.02.2014


Ответы (4)


SDImageCache *imageCache = [SDImageCache sharedImageCache];
[imageCache clearMemory];
[imageCache clearDisk];

Не забудьте также поместить эти строки кода в свой didReceiveMemoryWarning.

person carmen_munich    schedule 29.04.2013
comment
Текущая версия SDWebImage автоматически очищает кеш памяти при появлении предупреждений о нехватке памяти. Нет необходимости делать это и особенно нет необходимости очищать кеш диска. - person Tomas Andrle; 28.06.2013
comment
не могли бы вы добавить источник. Какая версия будет поддерживать именно эти функции? - person carmen_munich; 28.06.2013
comment
лучше использовать неблокирующую версию — clearDiskOnCompletion: - person Rizon; 16.10.2015
comment
@Rizon, clearDisk не блокирует! Единственное отличие состоит в том, что у него нет обратного вызова завершения. - person Iulian Onofrei; 09.11.2016
comment
Обновление для последней версии: SDImageCache *imageCache = [SDImageCache sharedImageCache]; [кэш изображения очищает память]; [imageCache clearDiskOnCompletion:^(){}]; - person Виктор Иванов; 12.04.2017

Нашел источник, если проблема. Кажется, меня обманул паттерн Singleton, использованный в SDImageCache. Кэш для расширения, который используется поверх UIImageView, управляется SDWebImageManager, у которого есть переменная экземпляра SDImageCache. Если вы хотите очистить кеш для расширения, вы должны вызвать его методы imageCache, такие как clearDisk и clearMemory.

person Eugene    schedule 14.12.2012
comment
не удалось вызвать метод очистки кеша. [[SDWebImageManager SharedManager] clearCaches] . я пробовал это, но это крах. пожалуйста, помогите мне. - person Suraj Shinde; 31.05.2013
comment
@SurajShinde Для SDImageCache такого метода нет, конечно, он выйдет из строя. Используйте [[[SDWebImageManager sharedManager] imageCache] clearDisk];, [[[SDWebImageManager sharedManager] imageCache] clearMemory]; - person Eugene; 31.05.2013
comment
Спасибо, на самом деле я использовал старый SDwebcache, у него не было экземпляра imageCache. - person Suraj Shinde; 01.06.2013
comment
В этом нет необходимости, отмеченный ответ делает то же самое. imageCache переменная экземпляра SDWebImageManager просто возвращает [SDImageCache sharedImageCache]. Посмотрите на метод createCache: github.com/rs/SDWebImage/blob/ мастер/SDWebImage/ - person Artem M; 16.02.2016

У меня работал только следующий код: Swift 5.0, Xcode 11, iOS 13, SDWebImage pod 5.0

 SDWebImageManager.shared.imageCache.clear(with: .all) {
        print("deleted all")
 }

где вы выбираете такие параметры, как SDImageCacheType.disk, SDImageCacheType.memory, SDImageCacheType.disk

Также, если вы хотите удалить конкретное изображение из кеша, используйте следующее:

SDWebImageManager.shared.imageCache.removeImage(forKey: "url of image", cacheType: .all)
person The iCoder    schedule 10.06.2020
comment
Это также работает со Swift 4, но: SDWebImageManager.shared()?.imageCache.removeImage(forKey: "url of image") - person Alessandro Porro; 06.10.2020

За исключением методов SDImageCache, я настоятельно рекомендую вам проверить URL-адреса ваших изображений. В моей ситуации я пробовал все методы для imageCache, и проблема с памятью все еще продолжалась. Сбои происходили в основном на iPhone 4s из-за того, что аппаратное обеспечение не могло с этим справиться.

Основной проблемой была кодировка URL с амперсандом!

Например, проверьте эти URL-адреса: первый URL-адрес использует «&», а второй — нет. Из-за амперсанда моя библиотека JSON не может прочитать значение ширины и ширины, которое становится намного выше, чем должно быть. Вот почему у меня были проблемы с памятью.

1) /select.php?imageid=101961221 "&" ;width=100 "&" ;isWatermarked=true

2) /select.phpimageid=101961221&width=100&isWatermarked=true

Кроме того, последние версии библиотеки SDWebImage включают класс UIImageView+WebCache.h, и он очень хорошо решает проблемы с кэшем.

person Göktuğ Aral    schedule 12.05.2015