SDWebImage的最大并發(fā)數(shù)是多少?
在類SDWebImageDownloader中齐婴,默認(rèn)并發(fā)數(shù)為
6(_downloadQueue.maxConcurrentOperationCount = 6)稠茂;
也可以修改maxConcurrentDownloads設(shè)置其下載并發(fā)數(shù)睬关;
SDWebImage緩存周期
SDWebImage緩存周期為一周,可以在類SDImageCache里面有kDefaultCacheMaxCacheAge常量电爹,定義的緩存時間丐箩;static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week
SDWebImage 緩存圖片命名規(guī)則
為了防止名稱重復(fù),對其進行 md5 運算;
默認(rèn)下載的超時時長是多少?
默認(rèn)為15秒涎嚼,可以在類SDWebImageDownloader中設(shè)置downloadTimeout
cleanDisk的執(zhí)行過程
i. 先遍歷所有的緩存文件挑秉,記錄過期的文件苔货,計算緩存文件的總大小
ii. 刪除過期的文件
iii. 判斷maxCacheSize的值是否>0立哑,如果大于0再判斷緩存的文件總大小是否大于maxCacheSize
iv.如果緩存文件的總大小超過maxCacheSize铛绰,刪除最早的文件
注意:.jpg产喉、.gif等文件需要把擴展名填上,png不需要
SDWebImages是如何識別圖片類型的这嚣?
NSData+ImageContentType.m中塞俱,根據(jù)圖片文件十六進制數(shù)據(jù)的第一個字節(jié)判斷
+ (NSString *)sd_contentTypeForImageData:(NSData *)data {
uint8_t c;
[data getBytes:&c length:1];
switch (c) {
case 0xFF:
return @"image/jpeg";
case 0x89:
return @"image/png";
case 0x47:
return @"image/gif";
case 0x49:
case 0x4D:
return @"image/tiff";
case 0x52:
// R as RIFF for WEBP
if ([data length] < 12) {
return nil;
}
NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
return @"image/webp";
}
return nil;
}
return nil;
}
SDImageCacheType 緩存類型
SDImageCacheTypeNone 永不緩存,但是從網(wǎng)上下載
SDImageCacheTypeDisk 只緩存到磁盤上
SDImageCacheTypeMemory 只緩存到內(nèi)存中
SDWebImageDownloaderProgressBlock 下載進度
typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteger expectedSize);
progress 參數(shù):
receivedSize 接收到的字節(jié)數(shù)
expectedSize 期望下載的字節(jié)數(shù)
//乘1.0是為了轉(zhuǎn)換成float類型
float progress = receivedSize * 1.0 / expectedSize;
例如:
NSURL *url = [NSURL URLWithString:@"http://picview01.baomihua.com/photos/20120624/m_14_634761470842343750_15728444.jpg"];
[self.imageView sd_setImageWithURL:url placeholderImage:nil options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
//乘1.0是為了轉(zhuǎn)換成float類型
float progress = receivedSize * 1.0 / expectedSize;
NSLog(@"下載進度 %f",progress);
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
NSLog(@"完成");
}];
下載順序SDWebImageDownloaderExecutionOrder
typedef NS_ENUM(NSInteger,SDWebImageDownloaderExecutionOrder) {
//以隊列的方式,按照先進先出的順序下載九秀。這是默認(rèn)的下載順序
SDWebImageDownloaderFIFOExecutionOrder,
//以棧的方式粘我,按照后進先出的順序下載。
SDWebImageDownloaderLIFOExecutionOrder
};
SDImageCache是怎么做數(shù)據(jù)管理的
SDImageCache分兩個部分友酱,一個是內(nèi)存層面的柔纵,一個是硬盤層面的。內(nèi)存層面的相
當(dāng)是個緩存器或详,以Key-Value的形式存儲圖片郭计。當(dāng)內(nèi)存不夠的時候會清除所有緩存圖
片。用搜索文件系統(tǒng)的方式做管理梧乘,文件替換方式是以時間為單位,剔除時間大于
一周的圖片文件夹供。當(dāng)SDWebImageManager向SDImageCache要資源時仁堪,先搜索內(nèi)存
層面的數(shù)據(jù),如果有直接返回鸟辅,沒有的話去訪問磁盤莺葫,將圖片從磁盤讀取出來,然
后調(diào)SDWebImageDecoder做Decoder洒缀,將圖片對象放到內(nèi)存層面做備份欺冀,再返回調(diào)用層。