我正在使用SDWebImage库从服务器下载图片。
https://github.com/rs/SDWebImage当服务器上的图片使用相同的URL进行更新时,SDWebImage无法更新缓存中的图片。
我正在使用SDWebImage库从服务器下载图片。
https://github.com/rs/SDWebImage当服务器上的图片使用相同的URL进行更新时,SDWebImage无法更新缓存中的图片。
SDWebImage
默认会进行一些缓存,因此如果图像发生更改,最好使用新的URL。例如,如果您可以控制URL并且可以在每次更改图像时更改它,则可以这样做。
如果不是这种情况,请尝试在 options
字段中使用 SDWebImageRefreshCached
以遵守 HTTP 缓存控制标头,像这样:
[imageView setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
options:SDWebImageRefreshCached];
点击这里查看更多信息。
更新:我已经写了一份完整的缓存指南,包括缓存验证,具体请见https://kean.github.io/blog/image-caching
SDWebImage
在设置SDWebImageRefreshCached
选项时使用NSURLCache
。苹果的URL加载系统实现了HTTP缓存,包括缓存响应的验证。 HTTP缓存相当复杂,但有许多初学者指南可供参考:
基本上,服务器需要在每个响应中包含一些HTTP缓存控制头。有许多不同的策略可以用于实现重新验证。您可以使用Last-Modified
或ETag
。这样,每次客户端发送请求时,它都会自动将先前缓存响应中的Last-Modified
或ETag
值包括在请求中。如果该图像未更改,则服务器将响应状态码302(未修改),NSURLConnection/NSURLSession
将透明地从NSURLCache
中提供缓存响应。您不必再次下载数据,但仍需每次发出请求时与服务器进行检查。
您还可以使用HTTP缓存控制指定到期日期。如果使用了到期机制,NSURLConnection/NSURLSession
将在缓存响应未过期之前不会重新验证缓存响应。
有关HTTP缓存控制的更多信息,请参见上面的链接。 HTTP缓存是一种通用的缓存机制,应尽可能使用它。
我建议使用Nuke框架进行图像加载(免责声明:由我编写)。它默认使用NSURLCache
,同时还具有保存解压图像的内存缓存。
这是一个使用 Swift 3 编写的代码,用于每次刷新缓存
imgCardBack.sd_setImage(with: URL(string: objUserData.back_image!), placeholderImage:UIImage(named: "cardBack"), options: .refreshCached)
Swift 4 只需在SDWebImage库中使用以下函数:
SDImageCache.shared().removeImage(forKey: (ImagePath), withCompletion: nil)
这个函数将删除内存和磁盘中保存的现金,然后只需在相同的位置上传您的新图像,它就能完美地工作。
请前往文件SDWebImageManager.m的第176行更改此行
if (options & SDWebImageRefreshCached) downloaderOptions |= SDWebImageDownloaderUseNSURLCache;
到下面的代码。
"if (options & SDWebImageRefreshCached) {
// force progressive off if image already cached but forced refreshing
downloaderOptions &= ~SDWebImageDownloaderProgressiveDownload;
// remove SDWebImageDownloaderUseNSURLCache flag
downloaderOptions &= ~SDWebImageDownloaderUseNSURLCache;
//ignore image read from NSURLCache if image is cached but force refreshing
downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse;
}