SDWebImage使用时,url未变,但图片资源变化如何及时更新展示内容

面试官提问频率比较高的一个问题就是:如果同一url对应图片资源已经改变,当使用SDWebImage时该如何处理才能让图片及时刷新内容?

iOS 9以前,SD未能很好地处理此类问题,需要我们手动修改一下源码,网络上答案满天飞,举个比较常用的处理方法:

1、发起时这样调用方法

[self.imageView sd_setImageWithURL:[NSURL URLWithString:urlStr] placeholderImage:nil options:SDWebImageRefreshCached];

2、修改SDWebImage源码,需要找到SDWebImageManager.m, 178行代码处换行并追加代码

 downloaderOptions &= ~SDWebImageDownloaderUseNSURLCache;

用这个方法可以解决如上问题,但为什么呢?下面我们结合新老版本的SDWebImage源码来实实在在的看看到底为什么这么改就可以,根本原因是什么?

首先要清楚一点,SDWebImage的缓存策略,NSURLCache + SDWebImageCache(也就是SD自己的缓存机制)

NSURLCache会缓存网络请求结果,一旦某次开启了同样的请求并指定可以返回NSURLCache的缓存内容,那么会直接调用NSURLCache的缓存内容直接返回

而url对应内容变化,客户端未刷新的原因就在于请求时,不小心指定了使用NSURLCache的优化机制直接返回了内容,却并未发起请求,去获取最新资源

好了,接下来看源码,我找到的是3.7.6的SDWebImage老代码

image

这里是下载任务开启前的操作,一旦指定了options 包含了SDWebImageRefreshCached类型,downloaderOptions会被追加一个SDWebImageDownloaderUseNSURLCache类型,标志着可以启用NSURLCache机制

然后看下一张图


image

下载任务开启前,缓存策略经过一个枚举并运算赋值成了 NSURLRequestUseProtocolCachePolicy

再看另一张图


image

定位到SDWebImageDownloaderOperation.m 文件,可以看到当需要缓存请求返回结果的时候,有一个if逻辑,当指定了对应的属性后才会不缓存本次请求结果

结合以上三段源码我们就可以得到结论了:

sd_setImageWithUrl 时,虽然我们指定了SDWebImageRefreshCached操作,但相关逻辑执行后,会启用NSURLCache机制,并在拿到请求结果后被NSURLCache缓存起来,下次有相同请求进来时,会触发NSURLCache机制,返回之前请求的结果,所以,导致url未变,图片资源已变,但客户端展示未刷新问题

然而,iOS9之后SDWebImage因NSURLConnection被废弃缘故,改用推荐的NSURLSession,在这之后,如果面临url不变,资源改变的情况,再也不需要动手修改源码了,下面我们看看改版后的SD做了什么

image

改版后,这处代码做了优化,判断条件修改为除非用户 指定了要启用NSURLCache缓存机制,否则默认情况不允许缓存response,规避掉了相关问题

但是,这样看上去每一次都会重新开启下载任务去下载啊,岂不是造成了资源浪费。答案是否定的,这里就需要引入网络通信协议相关概念,Http、Https缓存机制中提供了验证机制,利用Last-Modified 或者Entity Tag(ET)来验证当前已缓存的资源是否与服务端最新资源相同。有兴趣的朋友可以去看一下RFC文档

所以,重写willCacheResponse方法时,虽然不允许缓存请求结果,但是再进行请求时,由于验证机制的存在,仍然避免了相同资源的重复请求
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容