2015-11-01 58 views
5

我使用AlamofireImage在我的項目相當多,我用如何清除AlamofireImage setImageWithURL緩存

let URL = NSURL(string: "https://cdn.domain.com/profile/image.jpg")! 
imageView.af_setImageWithURL(URL) 

從我的CDN獲取的圖像。我做了一些測試,但糾正我,如果我錯了,這似乎將下載的圖像存儲到緩存中。我的測試包括下載一個5MB的圖像。第一次花了大約20秒,第二次是瞬間的。

我想知道的是如何清除特定URL /圖像的緩存並重新下載圖像?

說例如我更新用戶個人資料圖片。圖像名稱/ URL將完全相同,但我知道圖像隨着用戶從圖書館或相機中選擇新圖像而發生變化。我知道圖像已成功上傳到CDN,因爲我可以直接在CDN上看到文件夾中的新圖像。

回答

21

您需要從內存中緩存以及磁盤緩存中刪除映像。你可以做到這一點,如下所示:

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,允許訪問ImageDownloader中的底層sessionManager。目前尚未在實際發行版中提供,但應在本週的某個時間發佈。

+0

大。謝謝你。 – puks1978

+0

如何檢查它可以存儲和清除的最大緩​​存。我正在經歷某個時間,某些圖像似乎沒有全部下載,我也在使用相同的功能。如果您需要它,我會發佈一個新問題。 –

+2

出於某種原因,這不適合我。即使遠程圖像發生了變化,我仍然可以看到相同的圖像。 – Ross

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) 
     } 
0

我的緩存問題的解決方案:

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) 
} 
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 
     })