SDWebImage
SDWebImage具有缓存支持的异步映像下载程序。并添加了像UI元素分类UIImageView、UIButton、MKAnnotationView,可以直接为这些UI元素添加图片。
功能
- 对UIImageView、UIButton、MKAnnotationView添加Web图像和高速缓存管理
- 异步图像下载器
- 具有自动缓存到期处理的异步内存+磁盘映像缓存
- 背景图像解压缩以避免帧率下降
- 逐步加载图像(包括GIF图)
- 缩略图图像解码可节省大图像的CPU和内存
- 可扩展的图像编码器以支持海量图像格式,例如WebP
- 动画图像的全栈解决方案,可在CPU和内存之间保持平衡
- 可以自定义和组合的转换,可在下载后立即应用于图像
- 可定制的多缓存系统
- 可以自定义加载器(如照片库)来扩展图像加载功能
- 图像加载指示器
- 图像加载过渡动画
- 保证不会多次下载相同的URL
- 保证不会重复尝试伪造的URL
- 保证主线程永远不会被阻塞
- 支持OC和Swift
支持的图片格式
- Apple系统支持的图像格式(JPEG,PNG,TIFF,HEIC等),包括GIF / APNG / HEIC动画
- WebP格式,包括动画WebP(使用SDWebImageWebPCoder项目)
- 支持可扩展的编码器插件,用于BPG,AVIF等新图像格式。以及矢量格式,例如PDF,SVG。查看图像编码器插件列表中的所有列表
更多模块
查看 Github,有许多基于 SDWebImage 的三方库。
源码分析
SDWebImage架构图
时序图
从SDWebImage中提供的架构图中我们可以大概的看出,整个库分为两层,Top Level、Base Module。
- Top Level:当UIImageView调用加载image方法,会进入SDWebImage中的UIImageView分类,在分类中调用负责加载UIImage的核心代码块ImageManager,其主要负责调度Image Cache/Image Loader,这两者分别从缓存或者网络端加载图片,并且又进行了细分。Cache中获取图片业务,拆分到了memory/disk两个分类中;Image Loader中又分为从网络端获取或者从系统的Photos中获取。
- Base Module:获取到图片的二进制数据处理,二进制解压缩,二进制中格式字节判断出具体的图片类型。
核心类
- UIImageView+WebCache:SDWebImage加载图片的入口,随后都会进入sd_setImageWithURL: placeholderImage: 中。
- UIView+WebCache:由于分类中不能添加成员变量,所以runtime关联了sd_imageURL图片的url、sd_imageProgress下载进度;sd_cancelCurrentImageLoad方法取消当前下载,sd_imageIndicator设置当前加载动画,sd_internalSetImageWithURL: 内部通过SDWebImageManager调用加载图片过程并返回调用进度
- SDWebImageManager:内部分别由SDImageCache、SDWebImageDownloader来处理下载任务,
SDWebImage 入口
面向UIImageView的是UIImageView+WebCache这个分类,将图片的URL,占位图片直接给这个类,该类提供众多的设置方法,不过最后都会调用以下这个方法.
1 |
|
最后进入的是 UIView+WebCache 的 sd_internalSetImageWithURL方法中
1 |
|
UIView+WebCache通过关联为UIView扩展了几个属性
- sd_imageURL: 当前图片的URL
- sd_imageProgress: 当前view中图片loading的下载进度
- sd_imageTransition: 图片的过渡属性,内部包含了很多的属性duration、过渡的动画样式
- sd_imageIndicator: 图片loading的indicator图标
- sd_latestOperationKey: 最后一次的操作Key
UIView+WebCacheOperation
UIView+WebCacheOperation
中为UIView通过关联添加了一个 sd_operationDictionary
属性,是一个 MapTable
列表,类似于字典<Key:id
主要提供一下几个方法
1 | /// 通过key获取图片下载操作 |
SDWebImageOptions: 设置的图片加载以及缓存策略,这里只看几个常用的,具体请看 SDWebimageDefine.h -> SDWebImageOptions
1 | typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { |
SDWebImageManager
上面关于图片缓存和下载的调用的是SDWebImageManager里面的方法
1 | SDWebImageManager.m |
大概流程
1 | // 1.判断并处理url |
SDWebImageCombinedOperation
SDWebImageCombinedOperation 实现了 SDWebImageOperation 代理,而 SDWebImageOperation 里面只有一个cancel方法,上面那个NSMapTable里面的value 类型是 id
1 | /// 取消当前的operation任务 |