SDWebImage使用SDWebImageRefreshCached后,图片没有刷新的问题讨论

在使用SDWebImage库时,发现启用SDWebImageRefreshCached选项后,图片未能成功刷新。本文探讨该问题,涉及HTTP缓存机制,包括cache-control、Last-Modified和ETag等关键头信息。
1. 问题引入
 
 我想很多开发者都在使用SDWebImage,SDWebImage以其便捷性深受开发者欢迎。
 
 不过长期使用以后,可能你会发现的有时候也不是那么给力?
 
 主要问题表现在哪里呢?
 很多app都有用户的概念,用户一般都会有头像,基本上都上传到服务器上,而服务器往往也支持在pc端更新头像(比如微博、QQ等)。
 如果你的头像使用SDWebImage设置的,那么你会发现,pc端更新头像后,客户端可能(往往)不会自动更新!!!
 
 很多开发者会建议你设置SDWebImageRefreshCached标识,甚至SDWebImage的官网也这么说!
 
 那么SDWebImageRefreshCached到底能否解决我们的问题呢?
 
2. 原理分析

 我们来简单探讨一下SDWebImage的实现原理:
 SDWebImageManager内部利用SDWebImageDownloader来下载,它的缓存策略有两种,一种是用NSURL缓存,一种是自己定义了SDImageCache(内部使用NSCache)进行缓存。
 如果设置了SDWebImageRefreshCached标示位,那么SDWebImageDownloader则利用NSURL进行缓存,而且使用的policy为NSURLRequestUseProtocolCachePolicy。
 
 那么如果设置了SDWebImageRefreshCached标识位,图片是否更新则要取决于你服务器的cache-control设置了,如果没有cache-control的话,客户端则然享受不了自动更新的功能。
 所以说仅仅设置SDWebImageRefreshCached往往是不能解决问题的。。。。
 
 那么如何查看服务器是否支持cache-control呢?
 其实简单,只需要要终端输入 curl [url] --head,即可。
 
 如:
 curl http://www.devdiv.com/uc_server/data/avatar/000/00/00/01_avatar_big.jpg --head

 返回结果如下图:


3. 解决方案分析:
 那么如何让SDWebImage支持自动更新呢?
 实现方法有几种:
 1. 让服务器更新url,也就是说服务器端如果更新了头像,那么就生成新的url
 2. 让服务器端支持cache-control,由于小弟对服务器端开发知识有限,个人觉得这个策略可能无法满足客户端的需求,还请各位大神斧正
 3. 修改SDWebImage,让它支持http的Last-Modified或者etag(前提是服务器端也要支持)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值