前言:本文章非快餐搬运,需要花点耐心阅读,因为是结合自己理解从Manager 开始一个方法一个方法去阅读解析,这个过程是痛苦的、但是读完之后是喜悦的,也希望指出个人理解不准确的地方,大家共同进步。
文章设定:较少篇幅的代码片段直接复制过来解析说明,篇幅较长的就上截图了,这样也方便各位观看。
本篇文章采用属性定位代码片段方法来探究SDImageCacheConfig 的一些配置属性具体作用,而不仅仅通过头文件的注释去理解。
SDWebImageDownloader 单例里面开始阅读:
初始化里面就做了 defaultSessionConfiguration 配置初始化操作
operationClass 是SDWebImage 自定义的一个继承NSOperation 的 任务下载管理类,这里就不细解释了。
shouldDecompressImages 是否再下载完成立即解压的标识位
executionOrder 决定operation 的任务执行顺序,目前支持 FIFO(先进先出,队列)和LIFO(后进先出 栈)
_downloadQueue 下载队列,没啥好解释的,默认设置最大任务操作数 为6 个
HTTPHeaders :网络请求头部信息的映射字典
URLOperations 以 url为key SDWebImageDownloaderOperation为Value的映射
operationsLock : 信号量锁,用来保证 URLOperation 线程安全操作。
headersLock: 信号量锁,用来保证网络请求头部信息 线程安全操作。
我们进入 - (void)createNewSessionWithConfiguration:(NSURLSessionConfiguration *)sessionConfiguration 看看:
[self cancelAllDowloads] 创建新的网络任务之前先 取消队列任务
125 创建session delegateQueue 设置为nil,系统自动分配串行队列执行任务
下面开始从头文件挑一些比较经典的方法来"解说":
提供可自定义的下载任务类 需要继承NSOperation ,并且需要遵循SDWebImageDownloaderOperationInterface 协议,这个其实体现了面向协议编程的思想,开发者可以按照自己需求自定义NSOperation,只需遵循 SDWebImage 实现的协议即可,这样就避免了 去继承 SD的 SDWenImageDownloaderOperation。
看下dowloader 下载方法里面具体做了哪些操作:
可以看到 下载先调用了一个- (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url
options:(SDWebImageDownloaderOptions)options
progress:(nullableSDWebImageDownloaderProgressBlock)progressBlock
completed:(nullableSDWebImageDownloaderCompletedBlock)completedBlock
回调, 这个方法里面主要就是创建下载的token:
operation 其实是回调到外部下载方法里获取的入参(这样写只能说代码看起来比较紧凑)。我们还是回到 外部下载方法里面看看:
204-224 :设置超时时间,创建下载的缓存策略,创建下载请求request,以及cookies策略,特别说明一下 210 和215 采用位运算提高操作效率(比较亮眼,值得借鉴)。
217-222: block 外放自定义写法,开放给有修改header的需求的,没有就使用默认的header,多提一句AF也大量利用次特性来外放自定义(值得借鉴)
226- 230 :
验证方式:域名或者是 用户名密码
232 :
处理任务优先级
238:
任务执行的方式 前面已经说过了
到此 SDWebImageDownLoader 该说的也说的差不多了,其中不足的地方欢迎交流指正。