SDWebImage 4.x版本源码分析(一)图解!!!

本文分析的 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 新增功能调用接口
SDWebImage 4.x版本源码分析(一)图解!!!_第1张图片
image.png
SDWebImage 4.x版本源码分析(一)图解!!!_第2张图片
image.png

对于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 

...

[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图

SDWebImage 4.x版本源码分析(一)图解!!!_第3张图片
image.png
SDWebImage 4.x版本源码分析(一)图解!!!_第4张图片
image.png
  1. 我们便于调用的类别依赖于UIView+WebCache,UIView+WebCache依赖于SDWebImageManager;
  2. SDWebImageManager 由 SDWebImageManagerDelegate、SDImageCache、SDWebImageDownloader 组成,聚合关系但不是强依赖;
  3. SDWebImageManager 依赖于 SDWebImageCombinedOperation,SDWebImageCombinedOperation实现了SDWebImageOperation的代理;
  4. SDImageCache 由 SDImageCacheConfig 组成,依赖 SDWebImageCodersManager;
  5. SDWebImageDownloader 依赖 SDWebImageDownloaderOperation、SDWebImageDownloadToken、SDWebImageCodersManager;
  6. SDWebImageCodersManager 由 SDWebImageWebPCoder、SDWebImageImageIOCoder、SDWebImageGIFCoder组成;
  7. SDWebImageCodersManager、SDWebImageGIFCoder 实现了 SDWebImageCoder 的代理,SDWebImageWebPCoder、SDWebImageImageIOCoder 实现了 SDWebImageCoder 的子类 SDWebImageProgressiveCoder 的代理;
  8. SDWebImageDownloaderOperation 继承于 NSOperation ,并实现了SDWebImageDownloaderOperationInterface 、SDWebImageOperation的代理;
  9. SDWebImagePrefetcher 由SDWebImageManager 和 SDWebImagePrefetcherDelegate 组成;
  10. SDWebImage 声明了 6个 Delegate。

在文件中的位置:


SDWebImage 4.x版本源码分析(一)图解!!!_第5张图片
image.png

流程图:


SDWebImage 4.x版本源码分析(一)图解!!!_第6张图片
image.png

从流程图上看,

  1. 通常我们使用 UIImageView+WebCache 里的方法来设置网络图片的;
  2. UIImageView+WebCache 的主要方法是调用 UIView+WebCache 里的方法;
  3. UIView+WebCache 负责给 UIImageView 设置图片,
    ** 通过 SDWebImageManager 加载到图片,
    ** 把得到的 image 设置给 UIImageView
  4. SDWebImageManager 沟通 SDImageCache 和 SDWebImageDownloader ,
    ** 首先通过 SDImageCache 查询到是否有缓存的图片;
    ** 接着如果需要下载,就通过 SDWebImageDownloader 下载图片;
    ** 然后如果需要缓存,把图片缓存给 SDImageCache ;

下一章,五、详细的类的解析和该类的流程

你可能感兴趣的:(SDWebImage 4.x版本源码分析(一)图解!!!)