在上一篇中SDWebImage源码阅读(四)中介绍了SDWebImageDownloader 中异步下载的实现,这次开始阅读SDWebImage缓存的实现。SDImageCache继承自NSCache,维护一个内存缓存和一个可选的磁盘缓存。执行磁盘缓存写操作异步,所以它不会增加不必要的延迟到UI。
首先从.h文件中看起
定义了SDImageCache的三种获取策略
typedef NS_ENUM(NSInteger, SDImageCacheType) {
//图像无法从缓存中获取,但是可以从网络上下载
SDImageCacheTypeNone,
//从磁盘中获取图像
SDImageCacheTypeDisk,
//从内存中获取图像
SDImageCacheTypeMemory
};
之后
typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) {
//默认情况夏,图像存储在内存中时,不会去查询磁盘数据,这个标志强迫去查询磁盘数据
SDImageCacheQueryDataWhenInMemory = 1 << 0,
//默认情况下,同步查询内存缓存,异步查询磁盘缓存。此掩码可以强制同步查询磁盘缓存。
SDImageCacheQueryDiskSync = 1 << 1,
//默认情况下,图像根据原始大小进行解码。在iOS上,这个标志会缩小
图像的大小要与受限内存的设备兼容。
SDImageCacheScaleDownLargeImages = 1 << 2
};
之后定义了一个属性,SDImageCahceConfig,这个属性:缓存配置对象-存储所有类型的设置。
点击去开始阅读这个配置的文件,可以看到该文件中定义的配置属性各个属性的含义
//对下载和缓存的映像进行解压缩可以提高性能,但会消耗大量内存。默认为YES。如果由于内存消耗过多而导致崩溃,请将此设置为NO。
@property (assign, nonatomic) BOOL shouldDecompressImages;
//是否禁用iClound备份,默认为YES
@property (assign, nonatomic) BOOL shouldDisableiCloud;
//是否使用内存缓存 注:当内存缓存被禁用时,弱内存缓存也将被禁用。默认为YES。
@property (assign, nonatomic) BOOL shouldCacheImagesInMemory;
//为图像控制弱内存缓存的选项。当启用时,' SDImageCache '的内存缓存将使用一个弱maptable来存储图像在同一时间,当它存储到内存,并在同一时间被删除。
//然而当触发内存警告时,即使这个弱mapable并不持有对图像实例的强引用,甚至内存缓存本身被清除,一些图片被UIImageViews或者其他的实例强持有 能重新恢复,避免以后从磁盘缓存或者网络上查询,对于下面这个例子是很有用的,当app进入后台并且内存是被清除的时候,重新进入前台后会导致单元格闪烁
@property (assign, nonatomic) BOOL shouldUseWeakMemoryCache;
//从磁盘读取缓存时的读取选项。默认值为0。你可以设置这个为' NSDataReadingMappedIfSafe '来提高性能。
@property (assign, nonatomic) NSDataReadingOptions diskCacheReadingOptions;
//将缓存写入磁盘时的写入选项。默认为' NSDataWritingAtomic '。你可以将它设置为' NSDataWritingWithoutOverwriting '来防止覆盖现有文件。
@property (assign, nonatomic) NSDataWritingOptions diskCacheWritingOptions;
//缓存中保存图像的最长时间,以秒为单位。(默认设置为一周)
@property (assign, nonatomic) NSInteger maxCacheAge;
//缓存的最大字节
@property (assign, nonatomic) NSUInteger maxCacheSize;
//当清除磁盘缓存时检查清除缓存的属性,默认为修改日期
//@property (assign, nonatomic) SDImageCacheConfigExpireType diskCacheExpireType;
SDImageCacheConfigExpireType的枚举的含义为:
typedef NS_ENUM(NSUInteger, SDImageCacheConfigExpireType) {
//当图像被访问时,它会更新这个值
SDImageCacheConfigExpireTypeAccessDate,
//从磁盘缓存中获取映像(默认)
SDImageCacheConfigExpireTypeModificationDate
};
在SDWebImageConfig 中,只有一个init方法的实现,在init方法中实现初始化配置,例如其中
//默认缓存的最大时间
static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week
这个文件阅读完后,继续回到SDImageCache.h中,
//内存映像缓存的最大“总成本”。成本函数是存储在内存中的像素数。
@property (assign, nonatomic) NSUInteger maxMemoryCost;
//缓存应该容纳的最大对象数量。
@property (assign, nonatomic) NSUInteger maxMemoryCountLimit;
下面就是一些方法定义在.h中,相应方法的作用会写在SDImageCache中的解读中。
SDWebImage源码阅读(一)
SDWebImage源码阅读(二)
SDWebImage源码阅读(三)
SDWebImage源码阅读(四)
SDWebImage源码阅读(五)
SDWebImage源码阅读(六)
网友评论