SDWebImage 的詳解
我相信在開發過程中,大家都會用到這個框架,在GitHub上排名僅僅低於AFNetworking.這也是大多數開發者對這個框架的認同,也表明這個框架的牛逼之處,今天我們就仔細瞭解他的一些使用地方和這個框架的底層怎麼實現的.這次我們先談談SDWebImage實現原理,然後再帶大家看看日常怎麼使用.
1.SDWebImage的內部結構
為什麼要這樣說了,也不是沒有依據的,這是GitHub上的連結,大家可以自己下載下來. github.com/rs/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]);
}
第一個引數:要下載圖片的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的只是,其實我們只要知道這些基礎只是就夠用了,其他也不是太瞭解,等我後期再深入瞭解再過來補充一下.
相關文章
- IOS SDWebImage實現原理詳解iOSWeb
- 圖解SDWebImage圖解Web
- 老馬的春天:SDWebImage原始碼詳細解讀系列Web原始碼
- SDWebImage原始碼解讀Web原始碼
- SDWebImage原始碼解析之SDWebImageManager的註解Web原始碼
- SDWebimage(1)Web
- SDWebImage的快取策略Web快取
- 最新版SDWebImage的使用Web
- MJMJRefresh、SDWebImageWeb
- SDWebImage 筆記Web筆記
- SDWebImage中文說明Web
- iOS SDWebImage 學習iOSWeb
- SDWebImage 原始碼分析Web原始碼
- SDWebImage原始碼解析Web原始碼
- SDWebImage 原始碼解析Web原始碼
- SDWebImage原理小結Web
- SDWebImage原始碼剖析(-)Web原始碼
- SDWebImage清除快取Web快取
- 從SDWebImage原始碼中學到的Web原始碼
- 獲取SDWebImage下載的圖片Web
- SDWebImage Source Probe: DownloaderWeb
- SDWebImage原始碼解析(三)Web原始碼
- SDWebImage原始碼解析(四)Web原始碼
- SDWebImage原始碼剖析(二)Web原始碼
- iOS開發框架--SDWebImageiOS框架Web
- 通俗易懂的SDWebImage原始碼解析(二)Web原始碼
- SDWebImage類實現圖片的下載Web
- SDWebImage的基本用法及常見問題Web
- SDWebImage原始碼閱讀(上)Web原始碼
- SDWebImage使用及原始碼分析Web原始碼
- 2016筆記——SDWebImage筆記Web
- 原始碼閱讀:SDWebImage(十一)——SDImageCache原始碼Web
- 原始碼閱讀:SDWebImage(五)——SDWebImageFrame原始碼Web
- YYWebImage,SDWebImage和PINRemoteImage比較WebREM
- SDWebImage 快取機制(筆記)Web快取筆記
- 原始碼閱讀:SDWebImage(十六)——SDWebImageTransition原始碼Web
- 原始碼閱讀:SDWebImage(十四)——SDWebImageManager原始碼Web
- ios SDWebImage新增頭部引數iOSWeb