1 概述
SDWebImage
基本是iOS项目的标配。他以灵活简单的api,提供了图片从加载、解析、处理、缓存、清理等一些列功能。让我们专心于业务的处理。但是并不意味着会用就可以了,通过源码分析和学习,让我们知道如何用好它。学习分析优秀源码也可以从潜移默化中给我们提供很多解决日常需求的思路。下面就是一张图来概述SDWebImage
的所有类:
通过对这个图片的分析,我们可以把SDWebImage
的源码分为三种:
- 各种分类:
UIButton(WebCache)
为UIButton
类添加载图片的方法。比如正常情况下、点击情况下、的image属性和背景图片等。MKAnnotationView(WebCache)
为MKAnnotationView
类添加各种加载图片的方法。UIImageView(WebCache)
为UIImageView
类添加加载图片的方法。UIImageView(HighlightedWebCache)
为UIImageView
类添加高亮状态下加载图片的方法。FLAnimatedImageView(WebCache)
为FLAnimatedImageView
类添加加载动态的方法,这个分类需要引入FLAnimatedImage
框架。SDWebImage
推荐使用这个框架来处理动态图片(GIF)的加载。- UIImageView、UIButton、FLAnimatedImageView通过
sd_setImageWithURL
等api来做图片加载请求。这也是我们唯一需要做的。 - 上面的几个UIView子类都会调用
UIView(WebCache)
分类的sd_internalSetImageWithURL
方法来做图片加载请求。具体是通过SDWebImageManager
调用来实现的。同时实现了Operation取消、ActivityIndicator的添加与取消。
- 各种工具类:
NSData+ImageContentType
: 根据图片数据获取图片的类型,比如GIF、PNG等。SDWebImageCompat
: 根据屏幕的分辨倍数成倍放大或者缩小图片大小。SDImageCacheConfig
: 图片缓存策略记录。比如是否解压缩、是否允许iCloud、是否允许内存缓存、缓存时间等。默认的缓存时间是一周。UIImage+MultiFormat
: 获取UIImage对象对应的data、或者根据data生成指定格式的UIImage,其实就是UIImage和NSData之间的转换处理。UIImage+GIF
: 对于一张图片是否GIF做判断。可以根据NSData返回一张GIF的UIImage对象,并且只返回GIF的第一张图片生成的GIF。如果要显示多张GIF,使用FLAnimatedImageView
。SDWebImageDecoder
: 根据图片的情况,做图片的解压缩处理。并且根据图片的情况决定如何处理解压缩。
- 核心类:
SDImageCache
: 负责SDWebImage的整个缓存工作,是一个单列对象
。缓存路径处理、缓存名字处理、管理内存缓存和磁盘缓存的创建和删除、根据指定key获取图片、存入图片的类型处理、根据缓存的创建和修改日期删除缓存。SDWebImageManager
: 拥有一个SDWebImageCache
和SDWebImageDownloader
属性分别用于图片的缓存和加载处理。为UIView及其子类提供了加载图片的统一接口。管理正在加载操作的集合。这个类是一个单列
。还有就是各种加载选项的处理。SDWebImageDownloader
: 实现了图片加载的具体处理,如果图片在缓存存在则从缓存区。如果缓存不存在,则直接创建一个。SDWebImageDownloaderOperation
对象来下载图片。管理NSURLRequest对象请求头的封装、缓存、cookie的设置。加载选项的处理等功能。管理Operation之间的依赖关系。这个类是一个单列
.SDWebImageDownloaderOperation
: 一个自定义的并行Operation子类。这个类主要实现了图片下载的具体操作、以及图片下载完成以后的图片解压缩、Operation生命周期管理等。UIView+WebCache
: 所有的UIButton、UIImageView都回调用这个分类的方法来完成图片加载的处理。同时通过UIView+WebCacheOperation
分类来管理请求的取消和记录工作。所有UIView及其子类的分类都是用这个类的sd_intemalSetImageWithURL:
来实现图片的加载。FLAnimatedImageView
: 动态图片的数据通过ALAnimatedImage对象来封装。FLAnimatedImageView
是UIImageView
的子类。通过他完全可以实现动态图片的加载显示和管理。并且比UIImageView
做了流程优化。
2 实现流程
SDWebImage
为我们实现了图片加载、数据处理、图片缓存等一些列工作。通过下图我们可以分析一下他的流程:
通过这个图,我们发现SDWebImage
加载的过程是首先从缓存中加载数据。而且缓存加载又是优先从内存缓存中加载,然后才是磁盘加载。最后如果缓存没有,才从网络上加载。同时网络成功加载图片以后,存入本地缓存。