前言
在 iOS 的图片加载框架中,SDWebImage 可谓是占据大半壁江山。它支持从网络中下载且缓存图片,并设置图片到对应的 UIImageView 控件或者 UIButton 控件。在项目中使用 SDWebImage 来管理图片加载相关操作可以极大地提高开发效率,让我们更加专注于业务逻辑实现。
功能
1.提供了一个 UIImageView 的 category(分类)用来加载网络图片并且对网络图片的缓存进行管理
2.采用异步方式来下载网络图片
3.异步内存+磁盘映像缓存,并且自动处理过期的缓存图片
4.支持 GIF 动画
5.支持 WebP 格式
6.同一个 URL 的网络图片不会被重复下载
7.失效的 URL 不会被无限重试
8.耗时操作都在子线程,确保不会阻塞主线程
9.支持图片压缩跟解码
10....
文件结构图
解读SDWebImage UML 类图 和 流程图
我们便于调用的类别依赖于UIView+WebCache,UIView+WebCache依赖于SDWebImageManager;
SDWebImageManager 由 SDWebImageManagerDelegate、SDImageCache、SDWebImageDownloader 组成,聚合关系但不是强依赖;
SDWebImageManager 依赖于 SDWebImageCombinedOperation,SDWebImageCombinedOperation实现了SDWebImageOperation的代理;
SDImageCache 由 SDImageCacheConfig 组成,依赖 SDWebImageCodersManager;
SDWebImageDownloader 依赖 SDWebImageDownloaderOperation、SDWebImageDownloadToken、SDWebImageCodersManager;
SDWebImageCodersManager 由 SDWebImageWebPCoder、SDWebImageImageIOCoder、SDWebImageGIFCoder组成;
SDWebImageCodersManager、SDWebImageGIFCoder 实现了 SDWebImageCoder 的代理,SDWebImageWebPCoder、SDWebImageImageIOCoder 实现了 SDWebImageCoder 的子类 SDWebImageProgressiveCoder 的代理;
SDWebImageDownloaderOperation 继承于 NSOperation ,并实现了SDWebImageDownloaderOperationInterface 、SDWebImageOperation的代理;
SDWebImagePrefetcher 由SDWebImageManager 和 SDWebImagePrefetcherDelegate 组成;
SDWebImage 声明了 6个 Delegate。
通常我们使用 UIImageView+WebCache 里的方法来设置网络图片的;
UIImageView+WebCache 的主要方法是调用 UIView+WebCache 里的方法;
UIView+WebCache 负责给 UIImageView 设置图片,
** 通过 SDWebImageManager 加载到图片,
** 把得到的 image 设置给 UIImageView
SDWebImageManager 沟通 SDImageCache 和 SDWebImageDownloader ,
** 首先通过 SDImageCache 查询到是否有缓存的图片;
** 接着如果需要下载,就通过 SDWebImageDownloader 下载图片;
** 然后如果需要缓存,把图片缓存给 SDImageCache ;
如何使用
#import <SDWebImage/UIImageView+WebCache.h>
//常规下载
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
//获取缓存大小
[SDImageCache sharedImageCache] getSize];
//清理内存
[[SDImageCache sharedImageCache] clearMemory];
//清理磁盘空间
[[SDImageCache sharedImageCache] clearDisk];
总结
- 学习OC 分类
- 学习类库文件目录
- 学习缓存多种方式(内存,文件,避免失败重试,缓存文件压缩)
探讨
1. 如何避免缓存图片,不同步问题?
2. 随心邮哪些地方可以加缓存(客户端/后台)
3. 随心邮redis内存不够时,怎么处理?