其他源码解析

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;
}
  1. namespace : 命名空间 diskCacheDirectory:磁盘缓存目录 默认命名空间为@"default", 在沙盒 /Library/Caches 下创建以com.hackemist.SDWebImageCache.($namespace) 为完整的名字为名的文件夹作为磁盘缓存目录
  2. 初始化一些全局变量、队列、配置
        // 是否解压缩图片
        _shouldDecompressImages = YES;
        // 禁用iCloud
        _shouldDisableiCloud = YES;
        // 是否使用内存缓存
        _shouldCacheImagesInMemory = YES;
        // 磁盘文件读取选项    
        // NSDataReadingMappedIfSafe 使用这个参数后,iOS就不会把整个文件全部读取的内存了,而是将文件映射到进程的地址空间中。这么做并不会占用实际内存。这样就可以解决内存满的问题。
        // NSDataReadingUncached 数据将不会存入内存中,对于只会使用一次的数据,这么做会提高性能。 
        // NSDataReadingMappedAlways  数据始终会被存储在内存中,如果用户定义了NSDataReadingMappedIfSafe和这个枚举,那么这个枚举会优先起作用。
        _diskCacheReadingOptions = 0;
        // 缓存最大存储时间 单位:秒 默认 60 * 60 * 24 * 7 一周
        _maxCacheAge = kDefaultCacheMaxCacheAge;
        // 缓存最大大小  默认0 单位: 字节
        _maxCacheSize = 0;
  1. 以AutoPurgeCache(继承于NSCache)存储内存缓存
    注:只监听了 UIApplicationDidReceiveMemoryWarningNotification 通知然后移除全部对象 具体讨论内存 https://github.com/rs/SDWebImage/pull/1141

。。。。。。未完待续 周末慢慢写

上一篇下一篇

猜你喜欢

热点阅读