iOS SDwebImage源码解析

http://www.cnblogs.com/polobymulberry/category/785704.html
http://www.open-open.com/lib/view/open1456965631750.html
http://my.oschina.net/cao6793569/blog/497399
http://www.cnblogs.com/fyongbetter/p/5629647.html
http://www.360doc.com/content/15/0713/07/26281448_484554873.shtml
http://www.cnblogs.com/leeN/p/4975001.html

经常面试遇到 这样的面试官 来 小伙你给我说一下 SDwebimage 是什么原理,
然后会有百分之八十的iOS人员会回答 ,他用用来图片处理 以URL 为名字将图片存在内存和硬盘里.用的时候依次去去缓存,如果没有再去请求 然后再把他们缓存到内存和硬盘,最后显示出来.这么回答没有错,一开始我也是这么回答.但是个人感觉凡是这么回答的人 九成是没有真正的了解和看过他的源码的.就是在哪里看了一个 iOS的面试宝典的答案,就以为了解啦.
接下来我们将对 SD的源码进行一遍简单的梳理,
通过使用时的梳理可以看到的最后到的是这个函数


DB75055D-2B40-4A60-9C00-2834BADF2B48.png

可以看出来1.先把先前的线程停止加载
2.然后给UIview 关联的一个属性,属性的值是图片URL
3.通过manger 的到一个operation 可以看出来图片的下载和缓存是在manager里面完成的.
在manager中找了上面3这个函数.


54594C1B-CA7F-4953-A53F-C1ACEB53DD44.png

36C993E8-9382-49A4-B6D7-0BA32DE72220.png

根据名字可以看出来是,是查询磁盘的缓存目录更具key (url),返回值是一个NSopreation


4C21C3EE-9B66-4696-8503-D03629A5474B.png

可以看到这个函数中的功能就是
1.在内存中查找图片,然后block回调参数 图片和缓存类型
2.如果内存中没有那么开启异步线程,获取瓷盘中的的图片,然后存在内存中,回到主线程回调磁盘图片,然后返回这个线程
3.可以看出来,如果内存存在就不会返回 opreation. 如果没有就会返回opreation
好,我们接着看上一个函数block回调以后的处理,里面有一个这样的函数
这个函数里面会看到一个函数:


78E7C3E4-984B-4D14-BAA3-4CBE933F9948.png
,根据名字可以看出功能是根据URL 下载图片,
BD4240B9-1C5E-4DAD-8F4D-4BEFD094BB3F.png

进入这个函数以后可以看到 执行了 调用函数1


1D45F8F2-D078-4FC0-B865-9DCEAA424A73.png
5EA53DD3-51A3-4A27-BA5B-61A1C8693739.png

说实话 看不明白这些


29FA03A8-543C-462C-A460-7ABD3D00438A.png
5F9B3A18-BA7B-444F-A524-6ACF4DDACCD5.png

B8B9224C-4A35-4060-8DA2-E9A3FBFC2D81.png

那么最后在返回开始的地方


70504E4C-1FE6-4DA7-87B5-B6D0BC366991.png

1.加载图片2.加载暂未图,3.返回数据4.取消线程,5,返回错误

57A62772-C85B-4EFA-8B40-1D480048BEF6.png

其实写到这里,大概的思路已经清晰啦,但是还是很模糊,感觉是囫囵下肚.还没有西西的消化.

接下来我们简单的归纳一下
涉及到的类:

![ ![ ![44A06F6F-6837-45AE-B38C-64EC82242250.png](http://upload-images.jianshu.io/upload_images/1907672-3a58bc9af85c02bc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ](http://upload-images.jianshu.io/upload_images/1907672-2ef49cf62455ae78.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ](http://upload-images.jianshu.io/upload_images/1907672-8f0f84b2d04efb56.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

当然,里面还涉及到了其他的一些,一会接着一一解读,
UIImageview+WebCaChe 可以看出来是这是一个关于UIimageview的分类
SDWebimageManager 是一个管理者 才像是一个管理整体的把
SDiMAGEcAChe 图片混存的
Downloader 是用来下载的

我们先看整体的 UIImageview+WebCaChe


D8945E76-86CD-4CE0-BE56-7E00A3649CC4.png

这里面使我们最常用的一个方法,用URL 和展位图设置空间的图片,是异步的并且可以缓存/

![B2CF8E0C-0E4E-479B-BE44-0E42CB8862F1.png](http://upload-images.jianshu.io/upload_images/1907672-883585dd0f84f36e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

然后就去了manager去下载
这个是manager的初始化方法


AA821A4A-927D-45F2-9E54-6467AF74DB3E.png

这里单例new了一个manager,new 其实就是init 接着创建了
SDImageCache SDWebImagerDownLoader俩个类 这里是他的初始化方法.


F7C6CF58-2AC2-4C75-86C7-2E244B3A4F93.png
根据URL 获取图片纯存储的key,如果存在则取出,
046E08C5-C6DD-49FA-AD1B-021A8AB6E21C.png

根据URL 判断内存和磁盘中时候含有图片,这里用到了SDImageCache这个类


F6C50A1C-FDAC-4DE2-955A-2406E9D6053F.png

这里是更具URL 转换成的key 去取图片 内存和磁盘.这样,如果得到就在block中返回yes. 这里也用到了SDImageCache 和他的方法.


B27EA926-7E08-47B0-8FB0-38C6414C5DB0.png

存储图片和取消全部的线程
B62B240F-C4C4-4AA4-AD04-FA0190CFE2E2.png

再有就是这个函数 ,也就是前面 UIimageview+cache 分类中调用的方法.
先大概了解一下下面的东西


856D2F36-7C3C-49BC-8E67-604D75E30ED4.png
3F5370A4-7922-456C-858E-B7FF1CFD07E9.png

-(BOOL) respondsToSelector: selector 用来判断是否有以某个名字命名的方法(被封装在一个selector的对象里传递)

12A08F5A-2728-4312-8920-79102ECD4B63.png

把线程添加到数组中,如果线程已经取消那么这移除,然后判断下一下 将图片和 缓存类型返回.


425FE1AF-023A-442F-AD81-6296DFC527EB.png

设置options 但是我有点看不太明白

E20098E5-4F71-4B09-8E00-949F3865C818.png

将不合法的URL添加到黑名单


1F81BD28-ABF9-44FC-B78C-68B910CF774B.png

大概意思就是 即使图片已经被缓存啦 ,他还会在去远程请求图片.(不知道这个是什么机制怎么做到的啊)

146B3730-F9AB-480D-A245-62F25A594682.png

如果需要刷新图片那么就不做操作
制定了一个代理 用来旋转图片,旋转完以后,然后将图片存储在imageCache.而且是存在 磁盘,因为前面已经判断了 option 时候是存在内存的

C2871636-2186-4A51-9FA9-5F68475BE2E9.png

这个就不解释啦 就是存储

9187A940-D351-4292-A1E2-5FE40C63A42A.png

/auto-orient/strip%7CimageView2/2/w/1240)
如果 没有 options 那么久可以直接 block返回图片 再不然就返回空.这个函数结束,最后返回一个opreation
manager总结
整体就是
1.先判断URL 是否是在黑名单中,如果在那么就结束,
2.然后判断是否有错,如果有直接block返回 然后结束
3.将去磁盘和内存中去寻找图片,这是判断option 如果options是SDWebImageRefreshCached 那么直接去重新下载
4.这时如果没有图片或者需要刷新图片时,那么开始下载
5.同样判断线程是否存在,是否有错误返回,然后判断URL的是否可用然后加入黑名单
6.接下来就是看一下options 有没有要求之缓存在内存,如果没有的话,那么就缓存到磁盘和内存,同事判断是否要求刷新内存,如果要这步做处理
7.再就是判断是否需要旋转SDWebImageTransformAnimatedImage 通过代理实现并且返回旋转后的图片
8.下载完成以后就缓存

manager中涉及到了其他类
SDWebImageCombinedOperation
SDImageCache
SDWebImageDownloader

接着呢,我们就看一下  SDWebImageCombinedOperation   

![56CD83B1-A1CD-40CB-A764-EA1039350CF3.png](http://upload-images.jianshu.io/upload_images/1907672-ff465a078adeb797.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以看出来 他是继承与 NSoperation  并且准守了是哪个协议,后两个是是网络请求的  session 
![F140D943-A53E-4461-AB55-E69A5396DD2C.png](http://upload-images.jianshu.io/upload_images/1907672-e0c6b048bdca5d31.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
下一篇http://www.jianshu.com/p/d11815de83ec
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容