SDWebImage 的詳解

weixin_34107955發表於2017-11-03

我相信在開發過程中,大家都會用到這個框架,在GitHub上排名僅僅低於AFNetworking.這也是大多數開發者對這個框架的認同,也表明這個框架的牛逼之處,今天我們就仔細瞭解他的一些使用地方和這個框架的底層怎麼實現的.這次我們先談談SDWebImage實現原理,然後再帶大家看看日常怎麼使用.

1.SDWebImage的內部結構

1417158-ec48d59d90376a50.png

為什麼要這樣說了,也不是沒有依據的,這是GitHub上的連結,大家可以自己下載下來.  github.com/rs/SDWebImage

然後通過整理,裡面主要就三大塊.

1417158-9e135e0f061fc673.png
SDWebImage

主要就一個快取類,一個下載類,還有就是用到分類. 因為SDWebImageDownloader本身沒有下載功能,所以圖片下載是DownloadOperation這個分類執行.

下面簡單的說說這個方法背後的原理:

1.顯示placeholderImage

2.SDImageCache從快取中查詢圖片是否已經下載

3.先從記憶體圖片快取查詢是否有圖片

4.如果記憶體中有圖片快取,顯示圖片

5.如果記憶體中沒有,生成NSInvocationOperation新增到執行佇列開始從硬碟查詢圖片快取

6.如果硬碟中有,將圖片新增到記憶體快取中(如果空閒記憶體過小,會先清空記憶體快取),顯示圖片

7.如果硬碟中沒有,說明該圖片沒有快取,需要下載圖片,共享或重新生成一個下載器SDWebImageDownLoader開始下載圖片

8.開始圖片網路請求,下載資料

9.資料下載完成後交給SDWebImageDecoder做圖片解碼

10.回撥展示圖片

11.圖片儲存到硬碟快取和記憶體快取

12.SDImageCache初始化會註冊一些通知,在記憶體警告或退到後臺的時候清理記憶體圖片快取,應用結束的時候清理過期圖片

是不是感覺到了它邏輯的嚴密性和資源的最大化利用?是的,這就是為什麼SDWebImage如此成功的一個原因。

2.SDWebImage的使用

//1.下載圖片且需要獲取下載進度

//記憶體快取&磁碟快取

-(void)download

{

[self.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://img4.duitang.com/uploads/blog/201310/18/20131018213446_smUw4.thumb.600_0.jpeg"] placeholderImage:[UIImage imageNamed:@"Snip20160221_306"] options:SDWebImageCacheMemoryOnly | SDWebImageProgressiveDownload progress:^(NSInteger receivedSize, NSInteger expectedSize) {

} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

switch (cacheType) {

case SDImageCacheTypeNone:

NSLog(@"直接下載");

break;

case SDImageCacheTypeDisk:

NSLog(@"磁碟快取");

break;

case SDImageCacheTypeMemory:

NSLog(@"記憶體快取");

break;

default:

break;

}

}];

NSLog(@"%@",[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]);

}


1417158-8620de1e585edaef.png

第一個引數:要下載圖片的url地址

第二個引數:設定該imageView的佔點陣圖片

第三個引數:傳一個列舉值,告訴程式你下載圖片的策略是什麼

第一個block塊:獲取當前圖片資料的下載進度

receivedSize:已經下載完成的資料大小

expectedSize:該檔案的資料總大小

第二個block塊:當圖片下載完成之後執行該block中的程式碼

image:下載得到的圖片資料

error:下載出現的錯誤資訊

SDImageCacheType:圖片的快取策略(不快取,記憶體快取,沙盒快取)

imageURL:下載的圖片的url地址

03系統級記憶體警告如何處理(面試)

//取消當前正在進行的所有下載操作

[[SDWebImageManager sharedManager] cancelAll];//清除快取資料(面試)//cleanDisk:刪除過期的檔案資料,計算當前未過期的已經下載的檔案資料的大小,如果發現該資料大小大於我們設定的最大快取資料大小,那麼程式內部會按照按檔案資料快取的時間從遠到近刪除,知道小於最大快取資料為止。//clearMemory:直接刪除檔案,重新建立新的資料夾//[[SDWebImageManager sharedManager].imageCache cleanDisk];[[SDWebImageManager sharedManager].imageCacheclearMemory];

04SDWebImage  預設的快取時間是1周

05如何播放gif圖片/*

    5-1 把使用者傳入的gif圖片->NSData

    5-2 根據該Data建立一個圖片資料來源(NSData->CFImageSourceRef)

    5-3 計算該資料來源中一共有多少幀,把每一幀資料取出來放到圖片陣列中

     5-4 根據得到的陣列+計算的動畫時間-》可動畫的image

[UIImage animatedImageWithImages:images duration:duration];

*/06如何判斷當前圖片型別,只判斷圖片二進位制資料的第一個位元組    + (NSString*)sd_contentTypeForImageData:(NSData*)data;

07內部如何進行快取處理?使用了NSCache類,使用和NSDictionary類似

08沙盒快取圖片的命名方式為對該圖片的URL進行MD5加密  echo -n"url"|MD5

09當接收到記憶體警告之後,內部會自動清理記憶體快取

10圖片的下載順序,預設是先進先出的

附上一個比較好的基礎文件,blog.csdn.net/indulgein/article/details/51130812

其實SDWebimage 底層是通過runtime的只是,其實我們只要知道這些基礎只是就夠用了,其他也不是太瞭解,等我後期再深入瞭解再過來補充一下.

相關文章