Как очистить кеш AlamofireImage setImageWithURL
Я использую AlamofireImage в своем проекте довольно много, и я использую
let URL = NSURL(string: "https://cdn.domain.com/profile/image.jpg")!
imageView.af_setImageWithURL(URL)
чтобы получить изображение из моего CDN. Я проделал некоторые тесты, но исправлю меня, если я ошибаюсь, это, похоже, сохраняет загруженное изображение в кеш. Мои тесты включали загрузку 5-мегабайтного изображения. Первый раз это заняло около 20 секунд, второй раз был мгновенным.
Я хотел бы знать, как я могу очистить кеш для определенного URL/изображения и повторно загрузить изображение?
Скажем, например, обновляю профиль профиля пользователей. Имя/URL-адрес изображения будет точно таким же, но я знаю, что изображение имеет изменения, поскольку пользователь выбрал новое изображение из своей библиотеки или камеры. Я знаю, что изображение было успешно загружено в CDN, так как я вижу новое изображение в папке непосредственно на CDN.
Ответы
Ответ 1
Вам нужно удалить изображение из кеша в памяти, а также на кеш-диске на диске. Вы можете сделать это следующим образом:
func clearImageFromCache() {
let URL = NSURL(string: "https://cdn.domain.com/profile/image.jpg")!
let URLRequest = NSURLRequest(URL: URL)
let imageDownloader = UIImageView.af_sharedImageDownloader
// Clear the URLRequest from the in-memory cache
imageDownloader.imageCache?.removeImageForRequest(URLRequest, withAdditionalIdentifier: nil)
// Clear the URLRequest from the on-disk cache
imageDownloader.sessionManager.session.configuration.URLCache?.removeCachedResponseForRequest(URLRequest)
}
В настоящее время URLCache
может быть очищен таким образом только на ветке master
. Я просто нажал f35e4748, который позволяет получить доступ к базовому sessionManager
в ImageDownloader
. Это еще не доступно в реальном выпуске, но должно быть здесь на этой неделе.
Ответ 2
Swift3 и AlamofireImage 3.x
Похоже, removeImage делает все, что нужно.
// Clear what is in the cache, this will force a refresh to ensure fresh image is loaded next time
let urlRequest = Foundation.URLRequest(url: validUrl)
let imageDownloader = UIImageView.af_sharedImageDownloader
if let imageCache2 = imageDownloader.imageCache {
_ = imageCache2.removeImage(for: urlRequest, withIdentifier: nil)
}
Ответ 3
Надеюсь, это может вам помочь:
let URL = NSURL(string: "https://cdn.domain.com/profile/image.jpg")!
let imageDownloader = UIImageView.af_sharedImageDownloader
let imageCache = imageDownloader.imageCache
// Setting CachePolicy as reloadIgnoringLocalCacheData so that it won't use URL Cache next time when it is hitting same URL
let urlRequest = URLRequest(url: URL, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData)
// Clear the Image from the in-memory cache
let _ = imageCache?.removeImage(for: urlRequest, withIdentifier: nil)
imageView.af_setImage(withURLRequest: urlRequest, placeholderImage: UIImage(named: "placeholder"), completion: { (response) in
self.imageView.image = response.result.value
})
Ответ 4
Мое решение для проблемы кэширования:
func af_setImageIgnoreCache(string: String?) {
guard let url = string, let nsurl = URL(string: url) else { return }
let urlRequest = URLRequest(url: nsurl, cachePolicy: .reloadIgnoringCacheData)
let imageDownloader = ImageDownloader.default
if let imageCache = imageDownloader.imageCache as? AutoPurgingImageCache, let urlCache = imageDownloader.sessionManager.session.configuration.urlCache {
_ = imageCache.removeImages(matching: urlRequest)
urlCache.removeCachedResponse(for: urlRequest)
}
af_setImage(withURLRequest: urlRequest)
}
Ответ 5
Ответ, оставленный @cnoon, был правильным. Причина, по которой это не работает для многих из вас, заключалась в том, что вы, вероятно, использовали какой-то фильтр и передавали ноль в качестве параметра withIdentifier
.
В этом сценарии я использовал круговой фильтр:
// Clearing the cache didn't work like this
imageDownloader.imageCache?.removeImage(for: urlRequest, withIdentifier: nil)
// Worked when adding a CircleFilter().identifier() as 'withIdentifier' as such:
imageDownloader.imageCache?.removeImage(for: urlRequest, withIdentifier: CircleFilter().identifier)