SDWebImage解读(二)
2017-12-15 本文已影响1人
哦呵呵y
前言
继上一次篇,分析了最常用的设置图片的整个流程后,本篇本章记录对SDImageCache实现的分析
具体实现
SDImageCache maintains a memory cache and an optional disk cache.
Disk cache write operations are performed asynchronous so it doesn’t add unnecessary latency to the UI.
SDImageCache 负责了SDWebImage框架的图片缓存,包含了内存缓存和磁盘缓存两部分
一、创建
SDImageCache在 SDWebImageManager 类中通过单例方法创建,SDWebImageManager为最主要的管理类,以后再解析。
全能初始化方法:
- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns
diskCacheDirectory:(nonnull NSString *)directory {
if ((self = [super init])) {
NSString *fullNamespace = [@"com.hackemist.SDWebImageCache." stringByAppendingString:ns];
// Create IO serial queue
_ioQueue = dispatch_queue_create("com.hackemist.SDWebImageCache", DISPATCH_QUEUE_SERIAL);
_config = [[SDImageCacheConfig alloc] init];
// Init the memory cache
_memCache = [[AutoPurgeCache alloc] init];
_memCache.name = fullNamespace;
// Init the disk cache
if (directory != nil) {
_diskCachePath = [directory stringByAppendingPathComponent:fullNamespace];
} else {
NSString *path = [self makeDiskCachePath:ns];
_diskCachePath = path;
}
dispatch_sync(_ioQueue, ^{
_fileManager = [NSFileManager new];
});
#if SD_UIKIT
// Subscribe to app events
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(clearMemory)
name:UIApplicationDidReceiveMemoryWarningNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(deleteOldFiles)
name:UIApplicationWillTerminateNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(backgroundDeleteOldFiles)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
#endif
}
return self;
}
- namespace : 命名空间 diskCacheDirectory:磁盘缓存目录 默认命名空间为@"default", 在沙盒 /Library/Caches 下创建以com.hackemist.SDWebImageCache.($namespace) 为完整的名字为名的文件夹作为磁盘缓存目录
- 初始化一些全局变量、队列、配置
// 是否解压缩图片
_shouldDecompressImages = YES;
// 禁用iCloud
_shouldDisableiCloud = YES;
// 是否使用内存缓存
_shouldCacheImagesInMemory = YES;
// 磁盘文件读取选项
// NSDataReadingMappedIfSafe 使用这个参数后,iOS就不会把整个文件全部读取的内存了,而是将文件映射到进程的地址空间中。这么做并不会占用实际内存。这样就可以解决内存满的问题。
// NSDataReadingUncached 数据将不会存入内存中,对于只会使用一次的数据,这么做会提高性能。
// NSDataReadingMappedAlways 数据始终会被存储在内存中,如果用户定义了NSDataReadingMappedIfSafe和这个枚举,那么这个枚举会优先起作用。
_diskCacheReadingOptions = 0;
// 缓存最大存储时间 单位:秒 默认 60 * 60 * 24 * 7 一周
_maxCacheAge = kDefaultCacheMaxCacheAge;
// 缓存最大大小 默认0 单位: 字节
_maxCacheSize = 0;
- 以AutoPurgeCache(继承于NSCache)存储内存缓存
注:只监听了 UIApplicationDidReceiveMemoryWarningNotification 通知然后移除全部对象 具体讨论内存 https://github.com/rs/SDWebImage/pull/1141
。。。。。。未完待续 周末慢慢写