默认的缓存时间是1个星期,一个星期过后会自动删除1个星期前的缓存对象。设置缓存时间,这个是保存在硬盘上的
_maxCacheAge = kDefaultCacheMaxCacheAge;
static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7;
如果保存在内存中,SDWebImage默认是用Cache来做的
使用缓存的对象,其中AutoPurgeCache是继承NSCache的。
_memCache = [[AutoPurgeCache alloc] init];
SDImageCache内处理内存警告,以通知的方式处理的,clearMemory
cleanDisk的执行的过程
先遍历所有的缓存文件,记录过期的文件,计算缓存文件的总大小
删除过期的文件
判断maxCacheSize的值是否>0,如果大于0再判断缓存的文件总大小是不是大于maxCacheSize
如果缓存文件的总大小超过了maxCacheSize,删除最早的文件。
SDWebImage的最大并发数是6,有一个_downloadQueue队列,在SDWebImageDownloader.m的init方法中进行初始化。
_downloadQueue = [NSOperationQueue new];
_downloadQueue.maxConcurrentOperationCount = 6;
SDWebImage是支持gif的
在SDWebImage中是怎么判断文件的类型的?
在NSData+ImageContentType.m文件中是根据第一个字节去判断的
+ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data {
if (!data) {
return SDImageFormatUndefined;
}
uint8_t c;
[data getBytes:&c length:1];
switch (c) {
case 0xFF:
return SDImageFormatJPEG;
case 0x89:
return SDImageFormatPNG;
case 0x47:
return SDImageFormatGIF;
case 0x49:
case 0x4D:
return SDImageFormatTIFF;
case 0x52:
// R as RIFF for WEBP
if (data.length < 12) {
return SDImageFormatUndefined;
}
NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIString
Encoding];
if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
return SDImageFormatWebP;
}
}
return SDImageFormatUndefined;
}
SDWebImage缓存文件的名称是根据md5来算的,为了防止缓存图片的名称的冲突,md5重复的几率很小。
当收到内存警告的时候,在appdelegate中可以进行如下操作
-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
SDWebImageManager * manager=[SDWebImageManager sharedManager];
//取消当前的所有下载操作
[manager cancelAll];
//清楚内存缓存
[manager.imageCache clearMemory];
}