iOS SDWebImage 原始碼閱讀(二)快取

2021-07-22 16:26:11 字數 2472 閱讀 4725

快取部分從這部分開始

operation.cacheoperation = [self.imagecache querydiskcacheforkey:key done:^(uiimage *image, sdimagecachetype cachetype) 

if (!key)

首先是一些引數的判斷,必須都要存在。

uiimage *image = [self imagefrommemorycacheforkey:key];

if (image)

這幾句**是先從記憶體中根據key(url)取。

- (uiimage *)imagefrommemorycacheforkey:(nsstring *)key

再看memcache的型別

@property (strong, nonatomic) nscache *memcache;

會發現它記憶體快取用的是nscache,可能一般做一些快取大家就直接用字典了,其實這樣是不對的,首先沒有nscache那麼便於管理,清理記憶體也不方便。

另外,可能大家沒有注意到,memcache並不是普通的nscache,而是作者繼承nscache而實用的autopurgecache.

為什麼要這麼做呢?

看一下這個就知道了,在ios7以後nscache不能在記憶體警告的時候自動清除記憶體,經過我的測試確實是這樣的,所以作者在這裡繼承了乙個nscache,在裡面加入了這樣乙個通知

只要一收到記憶體警告的通知就清空記憶體,這樣就不會因為記憶體問題而崩潰了。

好,下面講如果從記憶體中沒有取到然後做什麼。

nsoperation *operation = [nsoperation new];

dispatch_async(self.ioqueue, ^

@autoreleasepool

dispatch_async(dispatch_get_main_queue(), ^);

}});

再看@autoreleasepool{};

他能夠保證在區域結束時變數能夠馬上被釋放,防止從硬碟將取出之後造成記憶體過高。

下面看從硬碟取出的過程。

- (uiimage *)diskimageforkey:(nsstring *)key 

return image;

}else

}

首先取出的nsdata資料,然後根據的格式做相應的操作,比如gif**,會取出陣列,然後用

[images addobject:[uiimage imagewithcgimage:image scale:[uiscreen mainscreen].scale orientation:uiimageorientationup]];

來返回可以動的。除此之外,還有webp型別喝普通型別。

然後還會根據的方向做一定的翻轉。並且對進行解壓(主要是去掉alpha通道,不然系統會自動做這個操作,影響效率)。

然後會計算出最後的大小並放入記憶體中。

以上是取的過程,下面看存的過程。

從網路取回後,會掉用下面的方法,之前還有乙個**方法,可以不實現。

- (void)storeimage:(uiimage *)image recalculatefromimage:(bool)recalculate imagedata:(nsdata *)imagedata forkey:(nsstring *)key todisk:(bool)todisk 

// if memory cache is enabled

if (self.shouldcacheimagesinmemory)

if (todisk)

if (imageispng)

else

#else

data = [nsbitmapimagerep representationofimagerepsinarray:image.representations usingtype: nsjpegfiletype properties:nil];

#endif

}[self storeimagedatatodisk:data forkey:key];

});}

}

首先判斷是否需要放入記憶體,如果需要,就放到記憶體中。

然後判斷是否需要放到硬碟中,如果需要:

又把這個過程放入非同步序列佇列中,並且根據的型別把變成二進位制資料存入硬碟中。

後有有乙個地方,可以禁止icloud同步。

// disable icloud backup

if (self.shoulddisableicloud)

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...

OrangePi One Android 原始碼編譯

一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...