SDWebImage源码解读(一)
2018-07-05 本文已影响19人
honey缘木鱼
SDWebImage 是目前最流行、使用最广泛的第三方图片处理框架,它不仅能够异步加载网络图片,还提供了一套图片缓存管理机制(内存缓存+磁盘缓存),功能非常强大。
SD内部已经帮我们把请求回来的数据或者缓存到本地的图片资源都进行了异步解压缩,因此不需要我们来做。
图片压缩流程:
假设我们使用 +imageWithContentsOfFile: 方法从磁盘中加载一张图片,这个时候的图片并没有解压缩;
然后将生成的 UIImage 赋值给 UIImageView ;
接着一个隐式的 CATransaction 捕获到了 UIImageView 图层树的变化;
在主线程的下一个 run loop 到来时,Core Animation 提交了这个隐式的 transaction ,这个过程可能会对图片进行 copy 操作,而受图片是否字节对齐等因素的影响,这个 copy 操作可能会涉及以下部分或全部步骤:
分配内存缓冲区用于管理文件 IO 和解压缩操作;
将文件数据从磁盘读到内存中;
将压缩的图片数据解码成未压缩的位图形式,这是一个非常耗时的 CPU 操作;
最后 Core Animation 使用未压缩的位图数据渲染 UIImageView 的图层。
解压缩是一个非常耗时的 CPU 操作,并且它默认是在主线程中执行的。那么当需要加载的图片比较多时,就会对我们应用的响应性造成严重的影响,尤其是在快速滑动的列表上,就会特别的卡顿。为什么要解压呢?因为当你进行图片渲染的时候,必须得到解压缩后的原始像素数据,才能进行图形渲染,这就是解压缩的原因。SD在SDWebImageDecoder这个文件中进行了强制解压缩,我们赋值给imageView的时候已经是解压缩的文件了,因此不会卡主主线程,不然默认是在主线程进行解压缩,图片一多,卡爆了。
1.SD的所有类的作用简单介绍
NSData+ImageContentType 通过Image data判断当前图片的格式
SDImageCache 缓存 定义了 Disk 和 memory二级缓存(NSCache)负责管理cache 单例
SDWebImageCompat 保证不同平台/版本/屏幕等兼容性的宏定义和内联 图片缩放
SDWebImageDecoder 图片解压缩,内部只有一个接口
SDWebImageDownloader 异步图片下载管理,管理下载队列,管理operation 管理网络请求 处理结果和异常 单例
存放网络请求回调的block 自己理解的数据结构大概是
// 结构{"url":[{"progress":"progressBlock"},{"complete":"completeBlock"}]}
SDWebImageDownloaderOperation 实现了异步下载图片的NSOperation,网络请求给予NSURLSession 代理下载
自定义的Operation任务对象,需要手动实现start cancel等方法
SDWebImageManager 核心管理类 主要对缓存管理 + 下载管理进行了封装 主要接口downloadImageWithURL单利
SDWebImageOperation operation协议 只定义了cancel operation这一接口 上面的downloaderOperation的代理
SDWebImagePrefetcher 低优先级情况下预先下载图片,对SDWebImageViewManager进行简单封装 很少用
MKAnnotationView+WebCache – 为MKAnnotationView异步加载图片
UIButton+WebCache 为UIButton异步加载图片
UIImage+GIF 将Image data转换成指定格式图片
UIImage+MultiFormat 将image data转换成指定格式图片
UIImageView+HighlightedWebCache 为UIImageView异步加载图片
UIImageView+WebCache 为UIImageView异步加载图片
UIView+WebCacheOperation 保存当前MKAnnotationView / UIButton / UIImageView异步下载图片的operations
2.SD的所有类操作图
核心类的基本操作图