SDWebImage 4.x版本源码分析(一)图解!!!
2018-03-17 本文已影响969人
快乐的老船长
本文分析的 SDWebImage 版本为4.3.2。可以来这里下载一下源码注释
一、为什么会出现SDWebImage?
二、SDWebImage不同版本的区别
三、SDWebImage的使用
四、解读SDWebImage UML 类图 和 流程图
五、详细的类的解析和该类的流程
- UIView+WebCache、SDWebImageManager
- SDWebImageDownloader
- SDWebImageCache
- SDWebImageDownloaderOperatiion
- 问题总结
一、为什么会出现SDWebImage?
SDWebImage作者 Olivier Poitrey
在SDWebImage 1.0版本的文档里说,由于用网络图片对UITableView缺乏支持用起来很难受,Google一番后也没有发现有哪个简单的库来为您执行异步图像抓取+缓存工作。
于是他找了他的好朋友Sebastien Flory(Fraggle)寻求帮助,后来他发现用NSOperation类来管理并发,UITableView中图片的加载响应速度提升很多。因此他重写了Fraggle的实现。
二、SDWebImage不同版本的区别
2.x
- 将UIImageView类图像和缓存管理添加到Cocoa Touch框架的类别
- 异步图片下载器
- 异步内存+磁盘映像缓存,并且自动处理过期的缓存图片
- 后台图像解压缩
- 保证相同的URL不会被多次下载
- 保证伪造的URL不会一次又一次地重试
- 保证主线程永远不会被阻塞
3.x
- 将UIImageView类图像和缓存管理添加到Cocoa Touch框架的类别
- 异步图片下载器
- 异步内存+磁盘映像缓存,并且自动处理过期的缓存图片
- 后台图像解压缩
- 保证相同的URL不会被多次下载
- 保证伪造的URL不会一次又一次地重试
- 保证主线程永远不会被阻塞
新增功能:
- 动画GIF支持
- WebP格式支持
- 使用GCD和ARC
- Arm64支持
4.x
- 类别UIImageView,UIButton,MKAnnotationView添加Web图像和高速缓存管理
- 异步图片下载器
- 异步内存+磁盘映像缓存,并且自动处理过期的缓存图片
- 后台图像解压缩
- 保证相同的URL不会被多次下载
- 保证伪造的URL不会一次又一次地重试
- 保证主线程永远不会被阻塞
- 使用GCD和ARC
说明上看起来没什么区别
从文件上看
新增
- 缓存配置类 SDImageCacheConfig
- 一堆Decoder类 对之前SDWebImageDecoder补充优化
- 图像变换类 SDWebImageTransition
- category 新增功能调用接口
对于GIF图的展示
- 从4.0版本开始,我们依靠FLAnimatedImage来照顾我们的动画图像。
- 要使用它,只需确保你我们FLAnimatedImageView而不是UIImageView。
- 注意:有一个向后兼容的功能,所以如果你还在试图加载GIF成UIImageView,它只会显示第一帧为静态图像。
- 重要提示:FLAnimatedImage仅适用于iOS平台,因此对于所有其他平台(OS X,tvOS,watchOS),我们将回退到上述向后兼容性功能
4.x支持
- iOS 7.0或更高版本
- tvOS 9.0或更高版本
- watchOS 2.0或更高版本
- OS X 10.8或更高版本
- Xcode 7.3或更高版本
向后兼容性
- 对于iOS <7.0,请使用最新的3.x版本 - 当前为3.8.2
- 对于iOS <5.0,请使用最新的2.0版本。
三、SDWebImage的使用
安装方法
// 必须
pod ‘SDWebImage'
// 可选 使用GIF
pod 'SDWebImage/GIF’
// 可选 使用WebP
pod 'SDWebImage/WebP’
使用
#import <SDWebImage/UIImageView+WebCache.h>
...
[imageView sd_setImageWithURL:[NSURL URLWithString:@"[http://www.domain.com/path/to/image.jpg](http://www.domain.com/path/to/image.jpg)"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
四、解读SDWebImage UML 类图 和 流程图
首先看一下UML图
image.png image.png
- 我们便于调用的类别依赖于UIView+WebCache,UIView+WebCache依赖于SDWebImageManager;
- SDWebImageManager 由 SDWebImageManagerDelegate、SDImageCache、SDWebImageDownloader 组成,聚合关系但不是强依赖;
- SDWebImageManager 依赖于 SDWebImageCombinedOperation,SDWebImageCombinedOperation实现了SDWebImageOperation的代理;
- SDImageCache 由 SDImageCacheConfig 组成,依赖 SDWebImageCodersManager;
- SDWebImageDownloader 依赖 SDWebImageDownloaderOperation、SDWebImageDownloadToken、SDWebImageCodersManager;
- SDWebImageCodersManager 由 SDWebImageWebPCoder、SDWebImageImageIOCoder、SDWebImageGIFCoder组成;
- SDWebImageCodersManager、SDWebImageGIFCoder 实现了 SDWebImageCoder 的代理,SDWebImageWebPCoder、SDWebImageImageIOCoder 实现了 SDWebImageCoder 的子类 SDWebImageProgressiveCoder 的代理;
- SDWebImageDownloaderOperation 继承于 NSOperation ,并实现了SDWebImageDownloaderOperationInterface 、SDWebImageOperation的代理;
- SDWebImagePrefetcher 由SDWebImageManager 和 SDWebImagePrefetcherDelegate 组成;
- SDWebImage 声明了 6个 Delegate。
在文件中的位置:
image.png
流程图:
image.png
从流程图上看,
- 通常我们使用 UIImageView+WebCache 里的方法来设置网络图片的;
- UIImageView+WebCache 的主要方法是调用 UIView+WebCache 里的方法;
- UIView+WebCache 负责给 UIImageView 设置图片,
** 通过 SDWebImageManager 加载到图片,
** 把得到的 image 设置给 UIImageView- SDWebImageManager 沟通 SDImageCache 和 SDWebImageDownloader ,
** 首先通过 SDImageCache 查询到是否有缓存的图片;
** 接着如果需要下载,就通过 SDWebImageDownloader 下载图片;
** 然后如果需要缓存,把图片缓存给 SDImageCache ;