SDWebImage5.11源码分析(二)

程序员 2024-9-18 00:27:44 88 0 来自 中国
接上一篇文章继续分析SDWebImage5.11的缓存部分
SDImageCache

缓存获取数据,主要是通过key缓存(上一篇文章有说),cacheType判定缓存方式,options举行缓存拓展。主要内容如下:
a. 对cacheOptions范例举行筛选
b. 进入queryCacheOperationForKey方法,对具体缓存方式举行分别,此中包罗内存缓存,磁盘缓存。然后又在各自缓存下面举行了具体分别,具体看源码
这里只挑几个重点代码

a、内存查找(为啥说缓存的查找是先内存呢,看下面这段代码)

// 先查抄内存内里的缓存    UIImage *image;    if (queryCacheType != SDImageCacheTypeDisk) {        // 通过key去内存表拿到value(image),默认实现表为weak(NSMapTable<KeyType, ObjectType> *weakCache)        image = [self imageFromMemoryCacheForKey:key];    }一般的queryCacheType默认为SDImageCacheTypeAll,在没有自界说queryCacheType为SDImageCacheTypeDisk的环境下都是先走的memoryCache
而imageFromMemoryCacheForKey这个方法内里的查找方式也很简朴,通过封装SDMemoryCache协议,并用NSMapTable<KeyType, ObjectType>范例存储的值去取到对应的image
// 是否只能在内存缓存查询,是的话直接将找到的image回调,注意这里是不查询data,以是data为nil    // 默认环境下,在内存缓存找到image是不查询data了,但是设置了SDImageCacheQueryMemoryData,就会强制去查询    BOOL shouldQueryMemoryOnly = (queryCacheType == SDImageCacheTypeMemory) || (image && !(options & SDImageCacheQueryMemoryData));    if (shouldQueryMemoryOnly) {        if (doneBlock) {            doneBlock(image, nil, SDImageCacheTypeMemory);        }        return nil;    }正常环境下,假如照片找到了,就直接回调block。但是在queryCacheType不指定为SDImageCacheTypeMemory,且options为SDImageCacheQueryMemoryData的时间那就得继续往下,去磁盘查找。
b、磁查问找

磁查问找分为同步跟异步,默认环境是异步查找,以下环境是同步查找
/*     *两种环境,必要同步查询磁盘     *1、在内存缓存中存在图片,但是指定标签为SDImageCacheQueryMemoryDataSync     *2、在内存缓存找不到图片,且指定标签为SDImageCacheQueryDiskDataSync     */    BOOL shouldQueryDiskSync = ((image && options & SDImageCacheQueryMemoryDataSync) ||                                (!image && options & SDImageCacheQueryDiskDataSync));磁盘的查找有2种方式

一种是通过SDDiskCache协议内部封装的方法,通过key获取path,然后拿到data
一种是通过additionalCachePathBlock拿到生存的path,然后拿到data
假如是通过磁盘拿到的image,还会将image生存到内存,以便下次查询。
这里说个小细节,磁查问询的过程是用了@autoreleasepool包了起来,为了防止多张照片查询,引起的内存飙升。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 22:34, Processed in 0.162645 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表