白话文:
下载图片需要什么。
无非就是url
以及以什么形式去下载,
没下载之前是否应该显示占位图,
====》分别对应url,option,placeholder
下载过程中我们关心什么
进度,下载了多少
对应=============》进度
下载完了我们该怎么处理图片,是框架直接给你设置好,还是给你你自己设置。
如果下载失败我们该怎么办。
对应============》完成回调
所以源码步骤如下,
1.先判断是否有已经进行的操作,如果有 咱也不能重复下载啊,肯定会先取消之前的操作。
2.还没有图片咱是不是应该给个好看的图片占位一下,这取决于你啊 所以得判断一下,option,如果让咱延迟设置占位图 ,那咱就啥也不干,如果不是让咱延迟设置,咱肯定设置占位图 所以就搞了这个方法
-(void)sd_setImage:(UIImage *)image imageData:(NSData *)imageData basedOnClassOrViaCustomSetImageBlock:(SDSetImageBlock)setImageBlock
3.然后咱开始准备下载了吧 下载得给咱点提示吧 所以咱得找个进度条啊 什么的表示一下吧。如果进度条能用 咱就加上去呗。还有进度的数据咱也应该初始化一下吧
4.接下来就是用manager下载了,下载需要啥 无非url 还有option 一些进度的回调啊(暴露给你让你做一些操作),统样完成之后你可能也得干点事 比如说处理这张图片数据,或者自己设置图片(咱也不敢问,咱也不敢说)。所以咱用了 (id <SDWebImageOperation>)loadImageWithURL:(nullable NSURL *)url
options:(SDWebImageOptions)options
progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock
completed:(nullable SDInternalCompletionBlock)completedBlock
这个方法会返回一个遵守<SDWebImageOperation>协议的对象 这个对象就是这个下载图片的操作呗,这个协议定义的方法就是一个取消操作的方法,所以咱下次如果更新了url重新下载图片,所以咱之前还没下完的,咱就得取消这个操作,这个操作就得被咱存储起来吧 ,所以就得 [self sd_setImageLoadOperation:operation forKey:validOperationKey];
方法去操作存储啊。
接下来咱说说completedBlock这个回调
这个回调干了啥事呢?
他是这么定义的 (UIImage * _Nullable image,NSError * _Nullable error,SDImageCacheType cacheType,NSURL * _Nullable imageURL)
这是完成回调嘛 肯定暴露给咱下载好的图片嘛 所以
第一个参数就是下载好的图片, 有种特殊情况就是万一咱下载的操作挂了呢。失败了呢
第二个参数就是失败后暴露的错误, 然后咱也得做一下缓存吧,缓存方式得设置一下吧,
第三个参数就是设置缓存类型,三种:网上下载(缓存个p),缓存内存,缓存到磁盘
第四个很明显 就是你要下载图片用到的url
完成回调咱该干什么呢?
1.你的指示器呢?是不是应该也应该移除了
2.你的进度呢,你到底下载完成了有进度,还是一点都没下载,你得判断一下你的进度吧,没有进度咱也得把你设置成完成状态
3.然后咱判断是不是应该设置图片
如果不应该(什么时候不应该呢,有两种情况,一种是我们得到了图片,但是option == SDWebImageAvoidAutoSetImage,一种是没有图片,并且SDWebImageDelayPlaceholder没有设置)
不应该设置咱就直接执行你给咱的回调。
如果不应该,咱就给你设置图片,设置图片咱得判断一下你图片是否存在?
1.存在,设置。
2.不存在,咱再判断你的option == SDWebImageDelayPlaceholder,是咱就直接把图片设置成你的占位图
网友评论