iOS - SDWebImage 源码分析

一个异步下载图片并且支持缓存的 UIImageView 分类。

一、功能介绍

  • 提供了一个 UIImageView 的 category 用来加载网络图片并且对网络图片的缓存进行管理
  • 采用异步方式来下载网络图片
  • 采用异步方式,使用 memory+disk 来缓存网络图片,自动管理缓存。
  • 支持 GIF 动画
  • 支持 WebP 格式
  • 同一个 URL 的网络图片不会被重复下载
  • 失效的 URL 不会被无限重试
  • 耗时操作都在子线程,确保不会阻塞主线程
  • 使用 GCD 和 ARC
  • 支持 Arm64

二、安装

CocoaPods

在工程内 Podfile 文件中添加:

1
platform :ios, '7.0' pod 'SDWebImage', '~> 4.0'

如果您使用的是Swift,请务必添加use_frameworks! 并将目标设置为iOS 8+:

1
platform :ios, '8.0' use_frameworks!

Carthage

在工程内 Cartfile 文件中添加:

1
github "rs/SDWebImage"

三、使用

1.使用 ImageView+WebCache category 来加载 UITableView 中 cell 的图片

1
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

2.使用 block,采用这个方案可以在网络图片加载过程中得知图片的下载进度和图片加载成功与否

1
2
3
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
//... completion code here ...
}];

3.使用 SDWebImageManager,SDWebImageManager 为UIImageView+WebCache category 的实现提供接口。

1
2
3
4
5
6
7
8
SDWebImageManager *manager = [SDWebImageManager sharedManager] ;
[manager downloadImageWithURL:imageURL options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
// progression tracking code
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
if (image) {
// do something with image
}
}];

4.加载图片还有使用 SDWebImageDownloader 和 SDImageCache 方式,但那个并不是我们经常用到的。基本上面所讲的3个方法都能满足需求。

三、SDWebImage 流程

四、SDWebImage 接口

SDWebImage 是一个成熟而且比较庞大的框架,但是在使用过程中并不需要太多的接口,这算是一种代码封装程度的体现。这里就介绍比较常用的几个接口。

1.给 UIImageView 设置图片的接口,SDWebImage 有提供多个给UIImageView 设置图片的接口,最终所有的接口都会调用下图的这个接口,这是大多数框架的做法。

2.获取 SDWebImage 的磁盘缓存大小,在项目中有时候会需要统计应用的磁盘缓存内容大小,那么获取图片的缓存大小就是使用这个接口来实现

1
[SDImageCache sharedImageCache] getSize];

3.清理内存缓存,清理内存中缓存的图片资源,释放内存资源。

1
[[SDImageCache sharedImageCache] clearMemory];

4.有了清理内存缓存,自然也有清理磁盘缓存的接口

1
[[SDImageCache sharedImageCache] clearDisk];

五、SDWebImage 库的内部类

通过对 UIImageView 的类别扩展来实现异步加载替换图片的工作。

主要用到的对象:
1.UIImageView (WebCache):入口封装,实现读取图片完成后的回调。
2.SDWebImageManager:对图片进行管理的中转站,记录那些图片正在读取。向下层读取Cache(调用SDImageCache),或者向网络读取对象(调用SDWebImageDownloader)。
实现 SDImageCacheSDWebImageDownloader 的回调。
3.SDImageCache:根据 URLMD5 摘要对图片进行存储和读取(实现存在内存中或者存在硬盘上两种实现)
实现图片和内存清理工作。
4.SDWebImageDownloader,根据 URL 向网络读取数据(实现部分读取和全部读取后再通知回调两种方式)
其他类:SDWebImageDecoder:异步对图像进行了一次解压。

------本文结束 感谢阅读------

本文地址:http://kaaaaai.cn/articles/iOS-sdwebimage-analysis.html
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布
转载请注明出处,谢谢!

众筹项目:拯救世界!
0%