下载过程:
SDWebImageManager:从缓存加载图片(缓存包括内存缓存和磁盘缓存)
SDImageCache:从缓存加载图片用到的一个类,所有的缓存操作都是它来执行的
如果缓存中没有图片,在它的回调函数里去创建 SDWebImageDownloader,它并没有真正的去执行下载操作,只是去设置下载操作,比如说超时多长时间就不下载了、还有一些请求操作,真正的下载操作是SDWebImageDownloader去调用SDWebImageDownloaderOperation
clearDisk (NSCache)清空磁盘缓存,将所有缓存目录中的文件,全部删除! 实际工作,将缓存目录直接删除,再次创建一个同名空目录!
cleanDisk (接收到应用程序将要终止通知)清理磁盘缓存策略
cleanDisk执行过程:
获取磁盘路径URL,根据路径获取资源(存入NSArray)
定义一个可变字典,记录所有缓存文件
定义一个可变数组,遍历资源,将过期文件记录到可变数组里边,累加文件的总大小,然后遍历过期文件数组删除过期文件
如果剩余磁盘缓存空间超出最大限额,再次执行清理操作,删除最早的文件 循环依次删除文件,直到低于期望的缓存限额,SDWebimage里边的期望限额为最大限额的一半
内存缓存是使用NSCache实现的,最大内存缓存值以像素为单位
最大磁盘缓存是以字节为单位,最大磁盘缓存的时间默认为1周
下载操作的最大并发数默认为6
下载操作的超时时长最长默认为15秒
SDWebImage是如何区分不同格式的图像的(精确判断文件类型):
#import "NSData+ImageContentType.h"
拿到文件的二进制数据,取出第一个字节和switch里的分支比较来判断
PNG:压缩比没有JPG高,但是无损压缩,解压缩性能高,苹果推荐的图像格式!
JPG:压缩比最高的一种图片格式,有损压缩!最多使用的场景,照相机!解压缩的性能不好!
GIF:序列桢动图,特点:只支持256种颜色!最流行的时候在1998~1999,有专利的!
SDWebImage缓存图片的名称是用URL的md5加密后生成的32位字符串作为文件名的
利用通知中心观察,能够保证缓存文件的大小始终在控制范围之内!
- UIApplicationDidReceiveMemoryWarningNotification 接收到内存警告的通知
执行 clearMemory 方法,清理内存缓存!
- UIApplicationWillTerminateNotification 接收到应用程序将要终止通知
执行 cleanDisk 方法,清理磁盘缓存!
- UIApplicationDidEnterBackgroundNotification 接收到应用程序进入后台通知
执行 backgroundCleanDisk 方法,后台清理磁盘!
内存缓存: 使用NSCahce对象实现
磁盘缓存: 使用 NSFileManager 存储在 Cache 目录中
SDImageCache提供了大量方法来缓存、获取、移除及清空图片。为了方便地在内存或磁盘中对它进行这些操作,
我们需要为每个图片设置一个key来索引它。在内存中将其作为NSCache的key值,在磁盘中用这key的md5作为图片的文件名。
在SDWebImage 中使用图片的 url 最为 key (md5)