SDWebImage 缓存使用了 Memory 和 Disk 双重 Cache 机制,实际操作使用了 NSCache 和 文件操作类处理,本地的文件缓存是放在沙盒的lib/cache文件夹下。
1.过去流程
2.最大缓存空间 + 最大缓存时间(默认),进入后台,低内存
3.类别
当我们需要去加载一张照片,首先
根据提供的URL的MD5从内存中查找,如果内存中查找不到
创建子线程中从本地沙盒中查找;
如果找到,就将图片缓存到内存中,并显示,否则
从网络加载之后,在子线程保存到本地文件,同时缓存到内存中,并显示。
本地和内存的缓存是通过SDImageCahce来实现。
通过添加UIImageView(WebCache) UIButton(WebCache)类目来扩展类的方法。
对于缓存的处理,SDWebIamge来注册事件监听缓存的情况,一旦内存过底,会根据缓存文件的时间,把旧的缓存文件清除。
写入本地文件是通过文件操作类,通过UIImageJPEGRepresentation将图片转化成NSData后写入到本地沙盒中。
SDWebImage缓存图片到沙盒中用到的目录是Library/Cache目录
//源代码
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
return [paths[0] stringByAppendingPathComponent:fullNamespace];
1.SDWebImage 的图片缓存采用的是 Memory 和 Disk 双重 Cache 机制
2.有一个叫做 NSCache 属性,用于实现我们对图片的 Memory Cache
3.UIApplicationDidReceiveMemoryWarningNotification :接受系统的内存警告通知,然后清除掉自身的图片缓存
4.SDWebImage 会将图片存放到 NSCachesDirectory 目录中:
- (nullableNSString*)makeDiskCachePath:(nonnullNSString*)fullNamespace {
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
return[paths[0] stringByAppendingPathComponent:fullNamespace];
}
然后为每一个缓存文件生成一个 md5 文件名, 存放到文件中
5.使用 SDWebImage 对 UIKit 的扩展,直接加载图片
sd_setImageWithURL
6.控制哪些缓存过期,以及剩余空间多少才够呢
@property(assign,nonatomic) NSInteger maxCacheAge;
@property(assign,nonatomic) NSUInteger maxCacheSize;
7.分别在应用进入后台和结束的时候,遍历所有的缓存文件,如果缓存文件超过 maxCacheAge 中指定的时长,就会被删除掉。
同样的, maxCacheSize 控制 SDImageCache 所允许的最大缓存空间。 如果清理完过期文件后缓存空间依然没达到 maxCacheSize 的要求, 那么就会继续清理旧文件,直到缓存空间达到要求为止。
static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week
上面是 maxCacheAge 的默认值,注释上写的很清楚,缓存一周。 再来看看 maxCacheSize。 翻了一遍 SDWebImage 的代码,并没有对 maxCacheSize 设置默认值。 这就意味着 SDWebImage 在默认情况下不会对缓存空间设限制
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(cleanDisk)
name:UIApplicationWillTerminateNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(backgroundCleanDisk)
name:UIApplicationDidEnterBackgroundNotification
object:nil];