SDWebImage梳理

加載流程

圍繞SDWebImageManager
sd_setImageWithURL() --> sd_internalSetImageWithURL

//首先從self的任務(wù)operations:NSMapTable 中取消任務(wù)
    [self sd_cancelImageLoadOperationWithKey:validOperationKey];

manager --> loadImageWithURL
創(chuàng)建operation

    SDWebImageCombinedOperation *operation = [SDWebImageCombinedOperation new];
    operation.manager = self;
 SD_LOCK(self.runningOperationsLock);
    [self.runningOperations addObject:operation];
    SD_UNLOCK(self.runningOperationsLock);

開始進(jìn)入加載圖片

 // Start the entry to load image from cache
    [self callCacheProcessForOperation:operation url:url options:options context:context progress:progressBlock completed:completedBlock];

開始查找緩存:內(nèi)存查找 --> 硬盤查找
key: 可自定義cacheKeyFilter,默認(rèn)url.absoluteString

// First check the in-memory cache...
    UIImage *image = [self imageFromMemoryCacheForKey:key];
  
 // Second check the disk cache...
    NSData *diskData = [self diskImageDataBySearchingAllPathsForKey:key];

如果有緩存,加載緩存串前,如果需要刷新緩存,則繼續(xù)請(qǐng)求網(wǎng)絡(luò)

// If image was found in the cache but SDWebImageRefreshCached is provided, notify about the cached image
 // AND try to re-download it in order to let a chance to NSURLCache to refresh it from server.
    [self callCompletionBlockForOperation:operation completion:completedBlock image:cachedImage data:cachedData error:nil cacheType:cacheType finished:YES url:url];
operation = [self createDownloaderOperationWithUrl:url options:options context:context];
[self.downloadQueue addOperation:operation];

開始緩存

   [self callStoreCacheProcessForOperation:operation url:url options:options context:context downloadedImage:downloadedImage downloadedData:downloadedData finished:finished progress:progressBlock completed:completedBlock];

緩存模塊

緩存配置類:SDImageCacheConfig

  • shouldCacheImagesInMemory 是否允許內(nèi)存緩存
  • shouldUseWeakMemoryCache 弱引用內(nèi)存緩存凌简,如果對(duì)象被釋放,則緩存也釋放
  • maxMemoryCount 緩存圖片個(gè)數(shù)限制恃逻,默認(rèn)0不限制
  • maxMemoryCost 最大內(nèi)存占用空間雏搂,默認(rèn)為0不限制藕施,1 pixel is 4 bytes (32 bits)

內(nèi)存緩存 SDMemoryCache
SDMemoryCache繼承自NSCache,通過(guò)weakCache: NSMapTable來(lái)緩存圖片,NSMapTabel對(duì)比NSDictionary有更多內(nèi)存語(yǔ)義(strong、weak畔派、copy铅碍、assign)

 self.weakCache = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsWeakMemory capacity:0];

value 弱引用,當(dāng)圖片被釋放時(shí)线椰,自動(dòng)刪除此key-value

- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g {
    [super setObject:obj forKey:key cost:g];
    if (!self.config.shouldUseWeakMemoryCache) {
        return;
    }
    if (key && obj) {
        // Store weak cache
        SD_LOCK(self.weakCacheLock);
        [self.weakCache setObject:obj forKey:key];
        SD_UNLOCK(self.weakCacheLock);
    }
}

內(nèi)存緩存時(shí)會(huì)在NSCache緩存一份胞谈,我們自定義的weakCache中再緩存一份

//取出緩存
- (id)objectForKey:(id)key {
    id obj = [super objectForKey:key];
    if (!self.config.shouldUseWeakMemoryCache) {
        return obj;
    }
    if (key && !obj) {
        // Check weak cache
        SD_LOCK(self.weakCacheLock);
        obj = [self.weakCache objectForKey:key];
        SD_UNLOCK(self.weakCacheLock);
        if (obj) {
            // Sync cache
            NSUInteger cost = 0;
            if ([obj isKindOfClass:[UIImage class]]) {
                cost = [(UIImage *)obj sd_memoryCost];
            }
            [super setObject:obj forKey:key cost:cost];
        }
    }
    return obj;
}

NSCache中取出緩存,在從weakCache中取出緩存憨愉,并同步到NSCache
NSCache是系統(tǒng)緩存烦绳,不受我們控制,可能會(huì)被隨時(shí)清空.

磁盤緩存

  1. 創(chuàng)建目錄
  2. 為每一個(gè)文件生成一個(gè)MD5文件名
  3. 清除磁盤緩存
  • 刪除超過(guò)截至日期的文件
  • 按訪問(wèn)或修改日期排序刪除更早的文件

下載模塊

創(chuàng)建NSOperation
生成NSURLRequest配紫,創(chuàng)建NSOperation

    NSOperation<SDWebImageDownloaderOperation> *operation = [[operationClass alloc] initWithRequest:request inSession:self.session options:options context:context];

控制任務(wù)優(yōu)先級(jí),先進(jìn)先出或者后進(jìn)先出

 if (self.config.executionOrder == SDWebImageDownloaderLIFOExecutionOrder) {
        // Emulate LIFO execution order by systematically adding new operations as last operation's dependency
        [self.lastAddedOperation addDependency:operation];
        self.lastAddedOperation = operation;
    }

SDWebImageDownloaderOperation重寫了start方法,當(dāng)[self.downloadQueue addOperation:operation];時(shí)径密,自動(dòng)執(zhí)行operationstart方法,[dataTask resume]則開始下載任務(wù)

//如果session不存在則創(chuàng)建session
            /**
             *  Create the session for this task
             *  We send nil as delegate queue so that the session creates a serial operation queue for performing all delegate
             *  method calls and completion handler calls.
             */
            session = [NSURLSession sessionWithConfiguration:sessionConfig
                                                    delegate:self
                                               delegateQueue:nil];
//生成dataTask
        self.dataTask = [session dataTaskWithRequest:self.request];
//執(zhí)行
  [self.dataTask resume];

NSURLSessionDataDelegate,NSURLSessionTaskDelegate代理方法躺孝,接收下載的數(shù)據(jù)

圖片編解碼
有時(shí)間在搞

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末享扔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子植袍,更是在濱河造成了極大的恐慌惧眠,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件于个,死亡現(xiàn)場(chǎng)離奇詭異氛魁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)厅篓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門秀存,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人羽氮,你說(shuō)我怎么就攤上這事或链。” “怎么了档押?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵株扛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我汇荐,道長(zhǎng),這世上最難降的妖魔是什么盆繁? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任掀淘,我火速辦了婚禮,結(jié)果婚禮上油昂,老公的妹妹穿的比我還像新娘革娄。我一直安慰自己倾贰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布拦惋。 她就那樣靜靜地躺著匆浙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厕妖。 梳的紋絲不亂的頭發(fā)上首尼,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音言秸,去河邊找鬼软能。 笑死,一個(gè)胖子當(dāng)著我的面吹牛举畸,可吹牛的內(nèi)容都是我干的查排。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抄沮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼跋核!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起叛买,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤砂代,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后聪全,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泊藕,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年难礼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娃圆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛾茉,死狀恐怖讼呢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谦炬,我是刑警寧澤悦屏,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站键思,受9級(jí)特大地震影響础爬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吼鳞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一看蚜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赔桌,春花似錦供炎、人聲如沸渴逻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惨奕。三九已至,卻和暖如春竭钝,著一層夾襖步出監(jiān)牢的瞬間梨撞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蜓氨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留聋袋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓穴吹,卻偏偏與公主長(zhǎng)得像幽勒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子港令,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,100評(píng)論 1 32
  • 圖片下載的這些回調(diào)信息存儲(chǔ)在SDWebImageDownloader類的URLOperations屬性中啥容,該屬性是...
    怎樣m閱讀 2,381評(píng)論 0 1
  • SDWebImage[https://github.com/rs/SDWebImage] 分析 Version 4...
    wyanassert閱讀 1,915評(píng)論 0 8
  • 簡(jiǎn)單的介紹 SDWebImage 提供圖片的異步下載和緩存,對(duì)外通過(guò) categories 封裝 UIImageV...
    Hi川閱讀 1,060評(píng)論 3 0
  • SDWebImage庫(kù)總體分為這么幾個(gè)部分: 類似UIImageView+WebCache這樣的面向使用者的接口顷霹,...
    毅個(gè)天亮閱讀 537評(píng)論 0 5