以前从来没有静下心来好好看看一些大神写的常用第三方库,现在看看,记录一下。。。
从使用看起

会经过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去管理
第三个是加深了对多线程的理解,以及一些多线程安全机制
第四就是图片缓存的处理,整个流程设计的非常缜密,安全好用,以及对过期图片的删除处理
本文记录了对SDWebImage第三方库的学习。详细介绍了图片下载和缓存的大致流程,包括下载任务的实现、接收数据处理、图片解码,以及查找缓存的处理等。还总结了学习收获,如图片解压流程、图片管理器设计模式、多线程理解和图片缓存处理等。
1160

被折叠的 条评论
为什么被折叠?



