SDWebImage

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];

你可能感兴趣的:(SDWebImage)