SDWebImage有感(一)

流程篇

最近为了给公司做SDWebImage分享,细细的对其研读了一番,本章节先大致说一下它的流程。

一,基本流程

SDWebImage有感(一)_第1张图片

借用一下作者的图,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.  定义一个对象存储一些操作和属性,服务于功能类,减少该类的属性,有利于维护,和代码的可读性。 

你可能感兴趣的:(SDWebImage有感(一))