美文网首页
SDWebImage源码阅读(五)

SDWebImage源码阅读(五)

作者: 落叶兮兮 | 来源:发表于2020-07-07 14:56 被阅读0次

在上一篇中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源码阅读(六)

相关文章

网友评论

      本文标题:SDWebImage源码阅读(五)

      本文链接:https://www.haomeiwen.com/subject/nydaqktx.html