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

从使用看起

SDWebImage源码阅读记录

会经过UIImageView+WebCache类里的UIImageView+WebCache

SDWebImage源码阅读记录

然后统一调用到UIView+WebCache里的

SDWebImage源码阅读记录

下面逐行解释该方法实现

SDWebImage源码阅读记录

 

SDWebImage源码阅读记录

SDWebImage源码阅读记录

SDWebImage源码阅读记录

SDWebImage源码阅读记录

下面的三个方法 介绍了如何将Operation 绑定到自己 并执行了什么操作。。。

SDWebImage源码阅读记录

接下来回到SDWebImageManager 里面创建 Operation的操作。

SDWebImage源码阅读记录

由于该方法比较长 捡重要的说。。。

下面方法是我删减了好多代码 把主要逻辑提取出来的 所以xcode会报错。。。 将就着看一下

SDWebImage源码阅读记录

里面有两个主要地方 一个是创建查找缓存的Operation 和 创建下载的Operation

我们先来看 下载的东西 

SDWebImage源码阅读记录

该方法要返回 的SDWebImageDownloaderOperation 

该方法里面只有一句 那就是调用了

SDWebImage源码阅读记录

同时传入了 创建SDWebImageDownloaderOperation的Block, 先来看该Block

SDWebImage源码阅读记录

block 详细介绍了 创建request的过程 以及一些Operation的基本设置(类似优先级什么的)

接下来我们往下看 这个地方为什么用了 block 不直接创建Operation呢?

SDWebImage源码阅读记录SDWebImage源码阅读记录

总结以上来说就是 先判断是否有正在进行的任务 有的话移除 然后重新添加

然后加入到任务队列downloadQueue里面 正式线程开启异步

同时创建一个对象 该对象只是个容器 保存了此次的任务及回调 为了给ImageManager统一管理 这个逻辑方式值得学习。。。

SDWebImageDownloaderOperation下载任务是怎么实现的呢 ----- 继承于NSOperation 

看一下start方法 从这里看到了SDImage网络方面是对NSURLSession的封装 不再详细讲述

感兴趣的可以细看一下 里面也有app进入后台的操作。。。

这里重点要讲一下 接收数据的处理

SDWebImage源码阅读记录

这个地方是对进度回调 很好理解

SDWebImage源码阅读记录

这个是一些大图边下载变显示的处理(感兴趣的可以多了解一下据说是没有使用 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;

里面做了很多的细节处理 不难看懂

大致意思就是从SDWebImage源码阅读记录

MemoryCache 里面取

取不到或者是有参数要求只从disk取的话   NSData *diskData = [self diskImageDataBySearchingAllPathsForKey:key];

diskImage = [self diskImageForKey:key data:diskData]; 这个方法里面有对图片解码 

这里要提及一点

存储磁盘data的时候是使用的Image Destination

SDWebImage源码阅读记录

这里只提了图片下载和缓存的大致流程,细节还要仔细挖掘。。。

总体看下来收获满满,第一个是图片解压流程及ios图片显示机制的问题,

第二个是图片管理器的设计模式,通过自定义对象 operation一层层嵌套到一个Manager去管理

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

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

 

相关文章:

  • 2022-12-23
  • 2021-11-30
  • 2021-11-24
  • 2022-01-14
  • 2021-04-29
  • 2021-05-26
  • 2021-07-09
  • 2021-04-07
猜你喜欢
  • 2021-07-29
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-28
  • 2022-12-23
相关资源
相似解决方案