SDWebImage源码解读(⼀)
SDWebImage是我们常⽤的图⽚缓存加载库,我们有必要对源码进⾏仔细阅读与学习,以便了解更多SD⽀持的功能与实现原理,并且在遇到问题时能及时的进⾏调试解决。我们再阅读之前先⾃⼰想想⼀下,如果我们⾃⼰来实现这个图⽚缓存与加载库,要怎么实现呢?感觉很简单就是下载图⽚,对UIImage进⾏赋值,同时对图⽚进⾏缓存⽅便下次更快的加载。SD作为更优秀的框架,有⼤量的使⽤者,所以对外提供了很多接⼝和拓展功能。看下图的作者给出的UML图,可以清晰的看出相互的调⽤关系。
SDWebImage图⽚加载的时序图
SDWebImageSequenceDiagram.png
第⼀步:调⽤对象调⽤对外暴露的sd_setImageWithURL(),设置图⽚信息下载的URL和辅助信息
第⼆步:调⽤UIView的sd_internalSetImageWithURL()⽅法,这⼀步会⾸先拿到当前view是否有正在进⾏的下载opration,如果有进⾏取消。设置进度回调block,拿到SDWebImageManager设置下载后对应的opration并保存。
第三步:调⽤SDWebImageManager的loadImageWithURL⽅法,此⽅法⾸先创建SDWebImageCombinedOperation并进⾏配置,⾸先通过imageCache调⽤queryDiskCacheForKey()查询url对应的缓存信息。如果没有缓存数据,调⽤SDWebImageDownloader的downloadImage⽅法去下载图标。待下载完成图⽚进⾏回调,在回调后Manager使⽤imageCache进⾏图⽚的缓存。
第四步:通过回调在获取到图⽚后,SDWebImageManager经过⼀步步的回调,将图⽚返回给调⽤者。
SDWebImage的基本架构图片下载站源码
SDWebImageStruct.png
SDWebImage4.3.2.png
见如基本架构图:
左侧为主要实现类,包括:Utils、Downloader、Cache、Decoder这⼏个核⼼模块
右侧为辅助类,包括:WebCacheCategories、Categories、FLAnimatedImage。这些辅助类主要是辅助对UI的拓展,⽅便我们使⽤,⽐如拓展常⽤的UIImageView。
重点说⼀下左侧核⼼模块:
Utils
SDWebImageManager:实现图⽚下载和缓存的管理,对外提供接⼝
SDWebImagePrefetcher:实现预加载,可以预先加载⼀组URL地址对应的图⽚
SDWebImageTransition:实现图⽚加载完毕后的展⽰动画,默认提供了7种,⽀持拓展
下载模块:
SDWebImageDownloader:下载中⼼,管理下载队列
SDWebImageDownloaderOperation:下载的具体队列
缓存图⽚:
SDImageCacheConfig:缓存的配置信息
SDImageCache:缓存的设置
解码中⼼:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论