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

1. 问题引入


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

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

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

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

image.png
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

即可。

3. 解决方案分析:


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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,196评论 4 61
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,845评论 18 139
  • 好多开发者,尤其是工作没有多久的新手,比较喜欢关注细节的东西。 我做移动开发好多年了,有一个感觉就是,技术没有秘密...
    汝阴龙阅读 701评论 0 0
  • 音级 乐音体系中的各个音,如1234567 就是各个音级。 全音和半音 把一个八度的距离等分为12等份,每一份就是...
    debugman007阅读 1,849评论 0 2
  • 面临找工作的大四学姐的呼喊
    tt逃亡阅读 272评论 0 0