iOS SDWebImage图片缓存处理

前言

以前一直使用,也没有花太多时间去看看实现的机制,现在抽时间好好研究一下,只有明白里面的实现才能使用的更顺手,即便出现问题,也能很快定位问题的位置。

导入头文件#import "SDWebImageCompat.h"

typedef NS_ENUM(NSInteger, SDImageCacheType) {

/**

* The image wasn't available the SDWebImage caches, but was downloaded from the web.

*/
SDImageCacheTypeNone,

/**

* The image was obtained from the disk cache.

*/
SDImageCacheTypeDisk,

/**

* The image was obtained from the memory cache.

*/
SDImageCacheTypeMemory

};

typedef void(^SDWebImageQueryCompletedBlock)(UIImage *image, SDImageCacheType cacheType);

typedef void(^SDWebImageCheckCacheCompletionBlock)(BOOL isInCache);

typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger totalSize);
/**

SDWebImage缓存机制类

*/
@interface SDImageCache : NSObject

/**

是否压缩,压缩下载的图片和缓存可以提高执行速度,但是会消耗大量内存,默认为yes,当程序出现因为过重的内存消耗而导致崩溃时,可将其设置为NO。

注意:该属性可能造成大量的内存消耗,之前在其他人bog中也看到过因为设置该属性为yes(默认就是yes)后造成大量内存消耗,图片的像素越高内存消耗越大。解决办法:

[SDImageCache sharedImageCache].shouldDecompressImages = NO;

[SDWebImageDownloader sharedDownloader].shouldDecompressImages = NO;

*/
@property (assign, nonatomic) BOOL shouldDecompressImages;

/**

保存在存储器中像素的总和

*/
@property (assign, nonatomic) NSUInteger maxMemoryCost;

/**

* The maximum number of objects the cache should hold.

*/
@property (assign, nonatomic) NSUInteger maxMemoryCountLimit;

/**

缓存的最大时间长度,单位为秒,超过这个时间,就过期了可用cleanDisk清除过期的图片资源。
*/

@property (assign, nonatomic) NSInteger maxCacheAge;

/**

缓存的最大容量,单位字节

*/
@property (assign, nonatomic) NSUInteger maxCacheSize;



/**

获得SDImageCache全局单列

*/
+ (SDImageCache *)sharedImageCache;



/**

存在图片到内存缓存中,根据设置的选项是否也保存到硬盘中

*

* @param image      保存的图片

* @param 是否从image图片中重新构建图片的二进制数据(该数据时保存到硬盘中的图片数据)

* @param imageData  获取的图片的二进制数据,有源代码可知道,如果imageData有值的话保存到硬盘的图片数据就是它

* @param key        唯一的图片缓存Key 值,一般是图片的决定路径

* @param toDisk      是否保存到硬盘中



- (void)storeImage:(UIImage *)image forKey:(NSString *)key;

- (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk;

以上两个函数其实也是调用了- (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk;只是使用了默认的参数而已。



*/

- (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk;



/**

* 异步获取图片先从内存缓存中,然后在从硬盘缓存中获取

*

* @param key 缓存图片时使用的key

*/

- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock;

/**

同步从内存缓存中获取图片

*/

- (UIImage *)imageFromMemoryCacheForKey:(NSString *)key;

/**

同步从硬盘缓存中获取图片

*/

- (UIImage *)imageFromDiskCacheForKey:(NSString *)key;



/**

* 从内存中移除图片,根据设置的选项决定是否也从硬盘上移除对应的图片数据

*

* @param key            缓存图片的唯一表识码

* @param fromDisk        是否也也移除保存到硬盘上key对应的图片数据

* @param completion      block给予一次当图片移除后如何操作



- (void)removeImageForKey:(NSString *)key;

- (void)removeImageForKey:(NSString *)key withCompletion:(SDWebImageNoParamsBlock)completion;

- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk;

以上三个函数也是调用了- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(SDWebImageNoParamsBlock)completion只是使用了默认参数而已。



- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(SDWebImageNoParamsBlock)completion;



/**

清除图片的内存缓存(注意:仅仅时内存中缓存,并不清除硬盘的图片数据)

*/

- (void)clearMemory;



/**

清除保存到硬盘的上的图片资源(不包括内存缓存),completion block提供硬盘图片资源清除的操作

- (void)clearDisk;调用了- (void)clearDiskOnCompletion:(SDWebImageNoParamsBlock)completion;函数,使用了默认参数

*/

- (void)clearDiskOnCompletion:(SDWebImageNoParamsBlock)completion;



/**

清除硬盘上过期的图片资源数据,参数为清除之图片数据之后的操作

- (void)cleanDisk调用了- (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock;使用了默认参数

*/

- (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock;



/**

* Get the size used by the disk cache

获取硬盘缓存消耗的磁盘容量大小

*/

- (NSUInteger)getSize;



/**

* Get the number of images in the disk cache

获得硬盘上的图片数量

*/

- (NSUInteger)getDiskCount;





/**

* Asynchronously calculate the disk cache's size.

异步计算硬盘缓存的大小

*/

- (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock;



/**

检查key相对的图片是否已经在硬盘缓存中,异步的

*/

- (void)diskImageExistsWithKey:(NSString *)key completion:(SDWebImageCheckCacheCompletionBlock)completionBlock;

/**

检查key相对的图片是否已经在硬盘缓存中,同步的

*/

- (BOOL)diskImageExistsWithKey:(NSString *)key;



/**

根据key获取对应图片的路径,参数path为设置的根路径

*/

- (NSString *)cachePathForKey:(NSString *)key inPath:(NSString *)path;



/**

根据某个唯一key值获得默认硬盘上保存图片数据的默认路径

*/

- (NSString *)defaultCachePathForKey:(NSString *)key;

@end

原文作者:jiangamh
原文链接:http://www.jianshu.com/p/314aadaf0fad
來源:简书


特别声明

笔者只是对原文进行一次排版。如造成侵权,请与我联系,微信:Q754922492。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容