前言
以前一直使用,也没有花太多时间去看看实现的机制,现在抽时间好好研究一下,只有明白里面的实现才能使用的更顺手,即便出现问题,也能很快定位问题的位置。
导入头文件#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。