SDWebImage有感(一)
流程篇
最近为了给公司做SDWebImage分享,细细的对其研读了一番,本章节先大致说一下它的流程。
一,基本流程
![](https://img.haomeiwen.com/i1840410/9f92aa494a84cf55.png)
借用一下作者的图,SDWebImage包装的一个基本过程:
1. UIImageView的sd_setImageWithURL方法调用UIView的sd_internalSetImageWithURL方法。
2. sd_internalSetImageWithURL调用SDWebImageManager的loadImageWithURL方法。
3. loadImageWithURL调用SDImageCache的queryCacheOperationForKey方法。该方法通过方法体判断是否有缓存(内存,磁盘),通过它的一个SDCacheQueryCompletedBlock(block)参数回调来处理方法体的结果(没有缓存时开始下载图片(SDWebImageDownloader的downloadImageWithURL方法))。
4. downloadImageWithURL调用addProgressCallback方法去创建下载。通过该方法的方法体来判断该图片是否已经被加入下载。没有加入的话通过它的一个createCallback(block)参数回调来处理方法体的结果(创建一个新的下载(SDWebImageDownloaderOperation的initWithRequest方法))。
5. 通过SDWebImageDownloaderOperation获取的下载结果在把下载结果一层一层的向前回调,最后传给UIImageView的sd_setImageWithURL方法供我们使用。
二,精妙的思想,用法
1. 作者接口设计层层深入,实现的方法只有一个值得我们借鉴。
2. 在每一个下载前首先取消掉该控件上的当前的下载,为了防止控件复用时造成的图片错乱。具体的解决方法是每个控件绑定一个NSMutableDictionary(使用字典主要是为了区分控件的状态),具体的实现是UIView+WebCacheOperation。
3. SDWebImageManager通过NSMutableSet存储failedURLs(NSMutableSet查找的效率比NSArray高出很多,NSMutableSet存储的数据是不能重复的,NSMutableSet是无序的)。
4. 定义一个对象存储一些操作和属性,服务于功能类,减少该类的属性,有利于维护,和代码的可读性。