0. 基本使用
入口
sd_setImageWithURL 会进入 UIView的分类, 走sd_internalSetImageWithURL方法
1. 取消已有的下载 *** 作
获取一个字典(key(className) : value(operation,下载任务))
比如cell上的图片 : 因为cell都是复用的,所以滑动的时候钱一个图片还没有下载完,就开始了另一个图片的下载
2. 获取 SDWebImageManager 单例
每次都会获取一个 manager 单例 ,
manager 里都有什么?
管理缓存的管理下载的无效图片地址的集合(防止无效的图片多次下载,浪费资源)下载任务的集合
1. 缓存管理器 单例 , 有些什么东西? _ioQueue :
_ioQueue = dispatch_queue_create("com.hackemist.SDImageCache", DISPATCH_QUEUE_SERIAL);
_config :串行队列,负责IO流.
config = SDImageCacheConfig.defaultCacheConfig;
_memoryCache也是一个单例, 设置了一些配置 , 比如图片在本地的最大存储时间,内存缓存类,磁盘缓存类
_diskCache内存缓存 : NSMapTable * weakCache ,用来做内存缓存,当收到内存警告的时候就会删除所有的
两个通知磁盘缓存 : 初始化了一个NSFileManager对象用来读写文件.
图片地址MD5后的结果为文件名,组成磁盘路径,判断磁盘中有没有这个图片,如果没有就写入这个文件
当app即将结束,或者进入后台的时候,会遍历磁盘中的所有图片,把超过7天的文件删除
2. 下载管理器 单例 , 有些什么东西? _config
_downloadQueue配置 : 最大下载量,下载超时时间15s
_URLOperations下载队列 , 最大并行数=6
_session可变字典,用来装下载任务
会话session : delegate = self
下载管理器会管理下载任务task的回调.
3. _failedURLs
无效的图片地址集合
_failedURLs = [NSMutableSet new];// 无效的图片地址 集合
4. _runningOperations
正在进行的下载任务集合
_runningOperations = [NSMutableSet new]; // 正在进行的下载任务集合
3. 设置占位图
4. 加载图片
从缓存中,或者下载,
看看url是否在无效的URL集合中,如果是,那么调用失败的回调
2. operation
创建一个operation,把这个operation放入manager的runningOperations中.
表示这个获取图片的任务正在执行
3. 获取图片
从缓存或者下载来获取图片
1. 缓存查找 内存中查找_memoryCache 的weakCache中查找 , key(url) : value(图片image) , 如果找到了就返回图片磁盘查找
通过_ioQueue串行队列,子线程查找磁盘文件,如果找到了,那么把data转换成image,添加到内存中
2. 去网络下载图片 创建下载任务
取消下载任务或移除下载任务SDWebImageDownloaderOperation : 自定义的NSOperation, 重写了start方法 , weak引用了manager中的session
start方法中创建了下载图片的task.
然后添加operation到了downloadQueue中,执行start方法.开始下载任务
存储下载的图片
内存,磁盘存储图片
5. 记录获取图片的 *** 作
将步骤4得到的获取图片的operation将入字典,供步骤1如果复用了来取消获取图片的 *** 作
6. 显示图片
步骤4的回调
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)