SDWebImage源码学习一:简介与架构

往期导航:

SDWebImage源码学习合集目录swift

简介

SDWebImage能够用来快速下载展现网络图片,最简单的使用只须要一行代码:缓存

//var imageView: UIImageView!
//var imageURL: NSURL!
imageView.sd_setImage(with: imageURL)
复制代码

就能够给UIImageView设置网络图片,SD内部自行管理下载,缓存,解码,彻底不用任何额外操做安全

稍微复杂点的用法能够本身配置图片下载的模式,缓存的逻辑,不一样格式的解码器,数据加密等markdown

在高级一点的用法,能够自定义下载器,自定义缓存器:包括磁盘缓存与内存缓存,自定义解码器网络

全部的这一切,SDWebImage内部都作了很好的封装与解耦,提供了很强大功能的同时也支持很是灵活的扩展,5.0后甚至能够经过添加插件来使用FLAnimatedImage,YYImage第三方库做为插件的方式集成进来一块儿使用。very牛逼!架构

学习SDWebImage的源码,能够学习他的架构设计,模块管理,内部的解耦思想,对项目架构设计有很好的启发。并且SD源码中带有很详细的文档说明,各个模块甚至还有类图说明,很方便学习他的设计原理。框架

宏观框架:

引用下SDWebImage官方的框架图:异步

来自官方GitHub

从上往下:工具

UI层

SD显示对UI层须要设置网络图片的控件进行了扩展,包括UIImageView,UIButton,NSButton(mscOS下),添加了便捷根据URL设置网络图片的方法,方法通过各类抽象,有最简单的设置一个URL,也有最复杂的设置URL,占位图,下载选项,下载上下文,进度回调,完成回调等,又由于这些控件的父类都是UIView,所以对UIView进行了扩展,来使用SDWebImageManager来对图片进行下载处理。post

当UIImageView调用分类设置图片URL时,在分类方法中,会依赖到Indicator接口来设置进度指示器,以及Transition接口来设置图片展现时的动画效果,封装处理好下载所需的options与须要贯穿在整个下载过程当中的context上下文后,分类中开始准备使用SDWebImageManager来进行图片获取,在这个过程当中,注入了ImagePrefetcher图片预加载器接口,容许能够在UIImageView准备下载图片以前,先对即将要下载的URL集合进行预下载,预加载完成后会把图片缓存起来,这样在SDWebImageManager准备获取图片时,能够快速直接读取缓存图片,节省时间。

核心调度层

SD的核心是SDWebImageManager类,这个类依赖着ImageCache接口来管理缓存,ImageLoader接口来管理下载,在收到UI分类中的获取图片指令以后,SDWebImageManager经过调度持有的cacher与loader高效的进行图片的缓存与下载,同时可使用options+context来配置缓存与下载的逻辑

缓存器

使用抽象接口SDImageCache来定义缓存器,提供高度自定义化的同时,提供同名的默认实现类,而每个ImageCache接口又依赖于两个细化的缓存接口:SDMemoryCacheSDDiskCache,分别用来管理内存缓存与磁盘缓存,也分别提供了同名的默认实现类

SDMemoryCache:使用weak map table实现的内存缓存管理器,保存了须要缓存在内存中的Image对象,并可根据系统内存进行优化,在内存紧张时还会经过释放不被视图强持有的图片资源来减轻内存负担。

SDDiskCache:把图片的数据写入到磁盘缓存或者从磁盘读取缓存的数据来供UI层使用,并提供了多钟过时规则供自由选择使用,磁盘操做所有都在内部串行的IO队列上同步或者异步的执行,全部数据敏感的操做都进行的加锁保护,缓存的数据能够在网络图片下载完成后写入到磁盘,使用时读取Data并进行解码后返回给UI层使用,同时会顺便写入内存缓存来加快下次访问速度。

缓存器还提供SDImageCachesManager来管理多个缓存器,且这个manager自己也实现了缓存器接口,能够做为缓存器使用,sd内部会自动选择合适的缓存器来处理

下载器

使用抽象接口SDImageLoader来定义下载器,提供同名默认实现类,持有URLSesson来从网络下载图片,也可使用Photos框架来异步从相册获取图片。

在下载网络图片时,使用Operation在下载队列执行下载任务,使用op复用技术来支持在对同一个url进行屡次加载时,复用同一个下载op,节约资源开销。

提供SDImageLoadersManager来管理多个下载器,自己也实现了下载器接口,做为默认的下载器使用。

底层模块

除了上层的UI层扩展,底层还有不少其余的模块来协助工做。

工具扩展

包括对图片数据的定义,辅助绘图,动图处理等。

图片编解码

使用SDImageCoder接口定义编解码器,还有一些辅助类来协助图片的编解码操做,默认提供了IOCoder,HEICCoder,GIFCoder,ANimatedCoder,WebPCoder,APNGCoder等编解码器来快速对各类图片数据下载完成后进行解码操做供UI层展现,后者对Image进行编码操做后给缓存器缓存到磁盘使用。

还提供了SDImageCOdersManager来管理多个图片解码器,能够自动根据图片的类型选择合适的解码器使用,自己也实现了SDImageCoder协议,做为默认的解码器来使用。

图片变换器

使用SDImageTransformer接口定义图片变换器,容许在对图片解码完成以后,对Image进行变换获得新的Image来使用,好比对图片进行圆角处理,缩放处理等。

提供了SDImagePipelineTransformer管道变换器,来管理多个变换器,自己也实现了变换器接口,能够对管理的多个图片变换器以管道的形式来逐个处理图像。

图片解密器

基于安全设置,下载过来的图片数据多是加密的,SD提供了SDWebImageDownloaderDecryptor接口定义图片数据解密器,方便快速实现自定义的解密器,对图片数据解码以前,会先异步对原数据进行解密操做以后再进行解码处理,默认提供了Base64解密器。

不过要注意的是解密器不支持进度图片下载,由于加密后的数据在部分下载过来时没法解密出部分图片信息,所以没法边下载边展现。

类结构

一样套用官方的最最最最最完整的类图: (点击放大) 完整的类图

简单介绍一下:

  • UI层几个能展现图片的子view扩展依赖于UIView的扩展,在UIView的扩展中进行开始图片的加载
  • UIView的扩展依赖SDWebImageOptions来配置下载选项
  • UIView还依赖SDWebImageManager来进行图片的加载
  • SDWebImageManager聚合了SDWebImagePrefetcher来进行图片的预加载操做
  • SDWebImageManager依赖SDWebImageCombinedOperation进行对图片的下载解码混合任务的管理
  • SDWebImageOperation定义了能够取消的异步任务,另外有几个继承的子接口来实现不一样的任务
    1. SDWebImageCombinedOperation接口用来聚合加载与缓存任务,
    2. SDWebImageDownloadToken历来管理网络下载任务
  • SDWebImageManager还聚合了SDImageCache与SDImageLoader接口来缓存,加载图片
  • SDImageCache组合了SDImageCacheConfig来设置缓存配置,依赖SDImageCache设置缓存选项
  • SDImageCache组合SDMemoryCache与SDDiskCache来管理内存、磁盘缓存,
  • SDWebImageDownloader实现了SDImageLoader接口来下载图片,并依赖SDWebImageDownloadToken与SDWebImageDownloaderOperation来管理下载任务
  • SDWebImageDownloader组合了SDWebImageDownloaderConfig来设置下载配置,依赖SDWebImageDownloaderOptions设置下载选项
  • SDWebImageDownloader组合了request modifier与response modifier来修改下载请求与相应数据
  • SDImageCache与SDWebImageDownloader都依赖SDImageCoder来编解码图片,而SDImageCoder接口有两个继承接口:SDProgressiveImageCoder用来进度编解码静态图,SDAnimatedImageCoder用来编解码gif, 这两个接口都有好几个默认实现
  • SDWebImageCachKeyFilter接口用来对缓存key进行修改处理
  • SDWebImageCacheSerializer接口用来对缓存数据在保存到磁盘前,对数据进行序列化处理
  • SDImageTransformer接口用来对图片进行变换处理,有一大堆默认实现
  • SDWebImageIndicator接口定义了下载图片是的进度指示器

以上就是我的对SDWebImage框架的初步了解,后续会一个个模块的学习分析下框架的设计理念,并记录下我的的看法,若有错误,欢迎评论指正~感激涕零~

相关文章
相关标签/搜索