SDWebImage加载url不变图片更新方法

1. 问题引入


我想很多开发者都在使用SDWebImage,SDWebImage以其便捷性深受开发者欢迎。

不过长期使用以后,可能你会发现的有时候也不是那么给力?

主要问题表现在哪里呢?
很多app都有用户的概念,用户一般都会有头像,基本上都上传到服务器上,而服务器往往也支持在pc端更新头像(比如微博、QQ等)。
如果你的头像使用SDWebImage设置的,那么你会发现,pc端更新头像后,客户端可能(往往)不会自动更新!!!

很多开发者会建议你设置SDWebImageRefreshCached标识,甚至SDWebImage的官网也这么说!
那么SDWebImageRefreshCached到底能否解决我们的问题呢?

SDWebImage加载url不变图片更新方法_第1张图片
image.png
SDWebImage加载url不变图片更新方法_第2张图片
image.png

2. 原理分析


我们来简单探讨一下SDWebImage的实现原理:
SDWebImageManager内部利用SDWebImageDownloader来下载,它的缓存策略有两种,一种是用NSURL缓存,一种是自己定义了SDImageCache(内部使用NSCache)进行缓存。
如果设置了SDWebImageRefreshCached标示位,那么SDWebImageDownloader则利用NSURL进行缓存,而且使用的policy为NSURLRequestUseProtocolCachePolicy。

那么如果设置了SDWebImageRefreshCached标识位,图片是否更新则要取决于你服务器的cache-control设置了,如果没有cache-control的话,客户端则然享受不了自动更新的功能。
所以说仅仅设置SDWebImageRefreshCached往往是不能解决问题的。。。。

那么如何查看服务器是否支持cache-control呢?
其实简单,只需要要终端输入

 curl [url] --head
SDWebImage加载url不变图片更新方法_第3张图片

即可。

3. 解决方案分析:


那么如何让SDWebImage支持自动更新呢?
实现方法有几种:

  1. 让服务器更新url,也就是说服务器端如果更新了头像,那么就生成新的url(推荐)
  2. 让服务器端支持cache-control
  3. 修改SDWebImage,让它支持http的Last-Modified或者etag(前提是服务器端也要支持)

参考文献:
浏览器缓存详解:expires,cache-control,last-modified,etag详细说明
iOS网络缓存扫盲篇--使用两行代码就能完成80%的缓存需求
SDWebImage使用SDWebImageRefreshCached后,图片没有刷新的问题讨论

你可能感兴趣的:(SDWebImage加载url不变图片更新方法)