SDWebImage源码阅读记录

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

从使用看起

会经过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去管理

第三个是加深了对多线程的理解,以及一些多线程安全机制

第四就是图片缓存的处理,整个流程设计的非常缜密,安全好用,以及对过期图片的删除处理

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值