SDWebImage框架學(xué)習(xí)(一)

SDWebImage的最大并發(fā)數(shù)是多少?

在類SDWebImageDownloader中,默認(rèn)并發(fā)數(shù)為
6(_downloadQueue.maxConcurrentOperationCount = 6);
也可以修改maxConcurrentDownloads設(shè)置其下載并發(fā)數(shù);

SDWebImage緩存周期

SDWebImage緩存周期為一周,可以在類SDImageCache里面有kDefaultCacheMaxCacheAge常量,定義的緩存時(shí)間;static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week

SDWebImage 緩存圖片命名規(guī)則

為了防止名稱重復(fù),對(duì)其進(jìn)行 md5 運(yùn)算;

默認(rèn)下載的超時(shí)時(shí)長(zhǎng)是多少?

默認(rèn)為15秒,可以在類SDWebImageDownloader中設(shè)置downloadTimeout

cleanDisk的執(zhí)行過(guò)程

i. 先遍歷所有的緩存文件,記錄過(guò)期的文件,計(jì)算緩存文件的總大小
ii. 刪除過(guò)期的文件
iii. 判斷maxCacheSize的值是否>0,如果大于0再判斷緩存的文件總大小是否大于maxCacheSize
iv.如果緩存文件的總大小超過(guò)maxCacheSize,刪除最早的文件
注意:.jpg、.gif等文件需要把擴(kuò)展名填上,png不需要

SDWebImages是如何識(shí)別圖片類型的?

NSData+ImageContentType.m中,根據(jù)圖片文件十六進(jìn)制數(shù)據(jù)的第一個(gè)字節(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 只緩存到磁盤(pán)上
SDImageCacheTypeMemory 只緩存到內(nèi)存中

SDWebImageDownloaderProgressBlock 下載進(jìn)度

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(@"下載進(jìn)度 %f",progress);
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
NSLog(@"完成");
}];

下載順序SDWebImageDownloaderExecutionOrder

typedef  NS_ENUM(NSInteger,SDWebImageDownloaderExecutionOrder) {
      //以隊(duì)列的方式,按照先進(jìn)先出的順序下載。這是默認(rèn)的下載順序
    SDWebImageDownloaderFIFOExecutionOrder,
      //以棧的方式,按照后進(jìn)先出的順序下載。
    SDWebImageDownloaderLIFOExecutionOrder
};

SDImageCache是怎么做數(shù)據(jù)管理的

SDImageCache分兩個(gè)部分,一個(gè)是內(nèi)存層面的,一個(gè)是硬盤(pán)層面的。內(nèi)存層面的相
當(dāng)是個(gè)緩存器,以Key-Value的形式存儲(chǔ)圖片。當(dāng)內(nèi)存不夠的時(shí)候會(huì)清除所有緩存圖
片。用搜索文件系統(tǒng)的方式做管理,文件替換方式是以時(shí)間為單位,剔除時(shí)間大于
一周的圖片文件。當(dāng)SDWebImageManager向SDImageCache要資源時(shí),先搜索內(nèi)存
層面的數(shù)據(jù),如果有直接返回,沒(méi)有的話去訪問(wèn)磁盤(pán),將圖片從磁盤(pán)讀取出來(lái),然
后調(diào)SDWebImageDecoder做Decoder,將圖片對(duì)象放到內(nèi)存層面做備份,再返回調(diào)用層。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容