Подтвердить что ты не робот

Как очистить кеш 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.

4b9b3361

Ответ 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)