使用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]; 

在这里查看更多

更新:我实际上已经写了一个关于缓存的完整指南,包括缓存validationhttps://kean.github.io/blog/image-caching

设置SDWebImageRefreshCached选项时, SDWebImage使用NSURLCache 。 Apple的URL加载系统实现HTTP缓存,包括缓存响应validation。 HTTP缓存非常复杂,但是有很多关于HTTP缓存的初学者指南:

  • 如何使用HTTP缓存优化您的站点
  • HTTP缓存

基本上,服务器需要在每个响应中包含一些HTTP缓存控制头。 有许多不同的策略可用于实现重新validation。 您可以使用Last-ModifiedETag 。 这样,每次客户端发送请求时,它将自动在您的请求中包含来自先前缓存的响应的Last-ModifiedETag值。 如果图像没有更改,服务器将使用状态代码302(未修改)进行响应, NSURLConnection/NSURLSession将透明地为您提供NSURLCache的缓存响应。 您不必再次下载数据,购买时仍需要在每次提出请求时检查服务器。

您还可以使用HTTP缓存控制指定到期日期。 如果使用过期机制, NSURLConnection/NSURLSession将不会重新validation缓存的响应,直到它没有过期。

有关HTTP缓存控制的更多信息,请参阅上面的链接。 HTTP缓存是一种通用缓存机制,应尽可能使用。

我建议使用Nuke框架进行图像加载(免责声明:由我写)。 它默认使用NSURLCache ,同时仍然具有保存解压缩图像的内存缓存。

这是swift 3中的代码,每次都刷新缓存

 imgCardBack.sd_setImage(with: URL(string: objUserData.back_image!), placeholderImage:UIImage(named: "cardBack"), options: .refreshCached) 

如果未更改URL,则SDWebImage现在可以知道服务器上的图像已更改。