SDWebImage源码分析(一)- 下载器实现

AFNetworking源码分析详解

一、从加载一张图开始梳理

在这里插入图片描述
在这里插入图片描述

VS AFNetworking

在这里插入图片描述

相对AFNetworking来讲,SDWebImage使用起来稍显晦涩一些,没有AFN那么直接

(一)更直接一些,set一张高清图片

在这里插入图片描述

sd_setImageWithURL

一步步进入源码 其实就是一个使用由简单到高阶的选择而已

其实可以选择不同复杂度的api使用 选择简单实用方式,内部默认使用的还是复杂api,只是参数自动补充nil而已:

sd_setImageWithURL:
sd_setImageWithURL:placeholderImage:
sd_setImageWithURL:placeholderImage:options:
sd_setImageWithURL:placeholderImage:options:context:
sd_setImageWithURL:placeholderImage:options:context:progress:completed:
sd_setImageWithURL:placeholderImage:options:context:setImageBlock:progress:completed:

在这里插入图片描述

imageCache 通过SDWebImageaManager获取,与AFNetworking cache不同的是,AFN的cache是通过下载器获取的,不是放在所谓的manager中

与AFN一样的是,ImageCache都是协议

(二)分析WebCache下载器

  1. 从第一次加载图片开始,还没有缓存逻辑

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. operation: SDWebImageOperation

SDWebImageOperation - NSOperation的扩展协议 可cancel

在这里插入图片描述
在这里插入图片描述

operation 是一组合,缓存operation & 加载器operation

在这里插入图片描述
在这里插入图片描述

  1. 下载

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

至此,下载主干流程关键代码已然,按照惯常线性逻辑,如果下载逻辑没办法具体,线性分析链条是中断的,更别提缓存了

(三)下载核心驱动逻辑

  1. 搞清楚几个operation究竟是什么

operation: SDWebImageOperation协议在这里插入图片描述

SDWebImageManager - loadImageWithURL:options:context:progress:completed

返回类型 operation: SDWebImageCombinedOperation(实现SDWebImageOperation协议)

SDWebImageCombinedOperation 其实是 cacheOperation:协议SDWebImageOperation 和 loaderOperation:协议SDWebImageOperation 两个协议的组合

在这里插入图片描述

在这里插入图片描述
给组合协议中的 loaderOperation 赋值
在这里插入图片描述

冗余 - 过渡查看operation走向在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

这是需要强烈吐槽一下 💢 组合协议之一 downloadOperationSDWebImageDownloaderOperation 为什么要用相同的名字呢,这会给读源码带来很多不必要的烦恼在这里插入图片描述
在这里插入图片描述

SDWebImageDownloaderOperation类 与 协议SDWebImageDownloaderOperation 定义的名称一模一样, 而且 request response dataTask 定义的都一模模一个样,这样的源码,本身不是很认同

不管则呢样,最终添加进operationQueue(downloadQueue)里的operation是 downloadOperation, 最外层operation(组合协议)中的一个, 另一个是cacheOperation,
downloadOperation的实现 是个继承NSOperation的 SDWebImageDownloaderOperation类实例

downloadOperation实现 — 继承自NSOperation的 start cancel,接收 NSURLSessionDataDelegate NSURLSessionTaskDelegate 的回调

  1. 几个operation流程图
IV SDWebImageManager SDWebImageDownloader SDWebImageDownloaderOperation 请求抽象组合operation 请求组合operation之一loaderOperation 请求loaderOperation 返回loaderOperation loaderOperation 添加进队列downloadQueue loaderOperation赋值填充抽象组合operation 返回抽象组合operation 关联存储抽象组合operation IV SDWebImageManager SDWebImageDownloader SDWebImageDownloaderOperation
  1. NSURLSessionTaskDelegate回调

在这里插入图片描述

loadoperation downloadQueue NSURLSession NSURLSessionTask SDWebImageManager 添加进队列 调度loadoperation执行start request初始化dataTask dataTask resume NSURLSessionDataDelegate回调 callCompletionBlockForOperation loadoperation downloadQueue NSURLSession NSURLSessionTask SDWebImageManager

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
4. 数据下载完成,complete回调
在这里插入图片描述

到此,SDWebImage下载主要流程算是完成,接下来缓存的故事,参考(二),尽快更新

AFNetworking源码分析详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值