使用SDWebImage在服务器上更改映像时如何更新缓存中的映像

Shu*_*ham 18 caching objective-c ios sdwebimage

我正在使用SDWebImage库从服务器下载图像. https://github.com/rs/SDWebImage

当使用相同的URL在服务器上更新映像时,SDWebImage无法更新缓存的映像.

Edg*_*gar 16

SDWebImage默认情况下会进行一些缓存,因此如果图像发生更改,最好使用新的URL.因此,例如,如果您可以控制URL并且每次图像更改时都可以更改它,则可以执行此操作.

如果不是这种情况,请尝试SDWebImageRefreshCachedoptions字段中使用以尊重HTTP缓存控制标头,如下所示:

[imageView setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
          placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
                   options:SDWebImageRefreshCached];
Run Code Online (Sandbox Code Playgroud)

在这里查看更多

  • 我已经尝试过此代码,但它没有更新图像.问题是,当我更新服务器上的图像并移回到上一个屏幕时,重新加载表视图后图像仍然相同. (5认同)

kea*_*ean 12

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

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

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

您还可以使用HTTP缓存控制指定到期日期.如果使用过期机制,NSURLConnection/NSURLSession则在未过期之前不会重新验证缓存的响应.

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

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


Har*_*kar 6

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

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