我正在使用SDWebImage库从服务器下载图像。 https://github.com/rs/SDWebImage
当使用相同网址在服务器上更新图像时,SDWebImage无法更新缓存的图像。
答案 0 :(得分:16)
SDWebImage
会执行一些缓存,因此如果图像发生更改,最好使用新的URL。因此,例如,如果您可以控制URL并且每次图像更改时都可以更改它,那么您可以这样做。
如果情况并非如此,请尝试在SDWebImageRefreshCached
字段中使用options
以尊重HTTP缓存控制标头,如下所示:
[imageView setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
options:SDWebImageRefreshCached];
查看更多here
答案 1 :(得分:12)
更新:我实际上已经编写了有关缓存的完整指南,包括缓存验证https://kean.github.io/blog/image-caching
设置SDWebImage
选项时, NSURLCache
会使用SDWebImageRefreshCached
。 Apple的URL加载系统实现了HTTP缓存,包括缓存响应验证。 HTTP缓存非常复杂,但是有很多关于HTTP缓存的初学者指南:
基本上,服务器需要在每个响应中包含一些HTTP缓存控制头。有许多不同的策略可用于实现重新验证。您可以使用Last-Modified
或ETag
。这样,每次客户端发送请求时,它都会自动在您的请求中包含先前缓存的响应中的Last-Modified
或ETag
值。如果图像没有更改,服务器将使用状态代码302(未修改)进行响应,NSURLConnection/NSURLSession
将透明地为您提供NSURLCache
的缓存响应。您不必再次下载数据,购买时仍需要在每次提出请求时检查服务器。
您还可以使用HTTP缓存控制指定到期日期。如果使用过期机制,NSURLConnection/NSURLSession
将不会重新验证缓存的响应,直到它没有过期。
有关HTTP缓存控制的更多信息,请参阅上面的链接。 HTTP缓存是一种通用缓存机制,应尽可能使用。
我建议使用Nuke框架进行图像加载(免责声明:由我写)。默认情况下,它使用NSURLCache
,同时仍然具有保存解压缩图像的内存缓存。
答案 2 :(得分:1)
以下是每次刷新缓存的swift 3中的代码
imgCardBack.sd_setImage(with: URL(string: objUserData.back_image!), placeholderImage:UIImage(named: "cardBack"), options: .refreshCached)
答案 3 :(得分:1)
转到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;
}
对我来说,它就像一种魅力。
答案 4 :(得分:1)
雨燕4 只需在SDWebImage库中使用以下功能:
SDImageCache.shared().removeImage(forKey: (ImagePath), withCompletion: nil)
此功能将删除已保存的现金和磁盘中的现金,之后只需同时上传您的新图像,即可正常运行。
答案 5 :(得分:-1)
如果未更改URL,SDWebImage现在可以知道服务器上的图像已更改。