以前从来没有静下心来好好看看一些大神写的常用第三方库,现在看看,记录一下。。。
从使用看起
会经过UIImageView+WebCache类里的UIImageView+WebCache
然后统一调用到UIView+WebCache里的
下面逐行解释该方法实现
下面的三个方法 介绍了如何将Operation 绑定到自己 并执行了什么操作。。。
接下来回到SDWebImageManager 里面创建 Operation的操作。
由于该方法比较长 捡重要的说。。。
下面方法是我删减了好多代码 把主要逻辑提取出来的 所以xcode会报错。。。 将就着看一下
里面有两个主要地方 一个是创建查找缓存的Operation 和 创建下载的Operation
我们先来看 下载的东西
该方法要返回 的SDWebImageDownloaderOperation
该方法里面只有一句 那就是调用了
同时传入了 创建SDWebImageDownloaderOperation的Block, 先来看该Block
block 详细介绍了 创建request的过程 以及一些Operation的基本设置(类似优先级什么的)
接下来我们往下看 这个地方为什么用了 block 不直接创建Operation呢?
总结以上来说就是 先判断是否有正在进行的任务 有的话移除 然后重新添加
然后加入到任务队列downloadQueue里面 正式线程开启异步
同时创建一个对象 该对象只是个容器 保存了此次的任务及回调 为了给ImageManager统一管理 这个逻辑方式值得学习。。。
SDWebImageDownloaderOperation下载任务是怎么实现的呢 ----- 继承于NSOperation
看一下start方法 从这里看到了SDImage网络方面是对NSURLSession的封装 不再详细讲述
感兴趣的可以细看一下 里面也有app进入后台的操作。。。
这里重点要讲一下 接收数据的处理
这个地方是对进度回调 很好理解
这个是一些大图边下载变显示的处理(感兴趣的可以多了解一下据说是没有使用 Incremental编码 会显示的时候有点儿模糊)
然后终点看一下下载完成的协议方法里面 有这么一句话
image = [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&imageData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(shouldScaleDown)}];
此处为图片的解码,此过程可以放在异步处理 当加在多图的时候可以提升性能,因为ios本身提供的图片imageNamed,contentFIle都是同步处理,当加载多图的时候会明显卡顿
接下看一下 查找缓存的处理
- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key options:(SDImageCacheOptions)options done:(nullable SDCacheQueryCompletedBlock)doneBlock;
里面做了很多的细节处理 不难看懂
大致意思就是从
MemoryCache 里面取
取不到或者是有参数要求只从disk取的话 NSData *diskData = [self diskImageDataBySearchingAllPathsForKey:key];
diskImage = [self diskImageForKey:key data:diskData]; 这个方法里面有对图片解码
这里要提及一点
存储磁盘data的时候是使用的Image Destination
这里只提了图片下载和缓存的大致流程,细节还要仔细挖掘。。。
总体看下来收获满满,第一个是图片解压流程及ios图片显示机制的问题,
第二个是图片管理器的设计模式,通过自定义对象 operation一层层嵌套到一个Manager去管理
第三个是加深了对多线程的理解,以及一些多线程安全机制
第四就是图片缓存的处理,整个流程设计的非常缜密,安全好用,以及对过期图片的删除处理