2016筆記——SDWebImage
之前覺得SDWebImage很好用,可以直接下載下來,放到檔案中,匯入標頭檔案“UIImageView+WebCache.h”即可使用。
效果:
但是他究竟幹了啥,之前並不知曉,今天好好研究研究:
1 ViewController:
呼叫sd_setImageWithURL:方法
2 UIImageView+WebCache:
呼叫sd_setImageWithURL:placeholderImage:options:progress:completed:方法
3 UIImageView+WebCache:
如果有placeholderImage,則顯示。
4 UIImageView+WebCache:
判斷URL是否存在,如果存在則把URL交給SDWebImageManager處理。
5 UIImageView+WebCache:
呼叫SDWebImageManager 的downloadImageWithURL:options:progress:completed:方法
completed引數是一個completedBlockA,可以回傳圖片、錯誤資訊、快取型別(無快取,磁碟快取,記憶體快取)、是否完成、圖片URL
6 SDWebImageManager:
判斷URL是否為String型別,如果是,則轉換為NSURL型別
7 SDWebImageManager:
判斷URL是否為NSURL型別,防止為NSNULL型別,否則會導致程式崩潰
8 SDWebImageManager:
判斷該URL是否失敗過
9 SDWebImageManager:
如果URL長度為空,或者該URL失敗過而且使用者設定的型別不是SDWebImageRetryFailed,那麼就返回錯誤資訊
10 SDWebImageManager:
生成一個快取該URL的key,如果使用者設定了生成器,則使用使用者的,如果沒有設定,那麼key就是該URL的字串
11 SDWebImageManager:
將key交給SDImageCache,呼叫queryDiskCacheForKey:done:從快取中查詢圖片。done引數是一個doneBlock,可以回傳image和快取型別,快取中如果沒有,則會去磁碟中查詢。如果在SDImageCache中查詢到了圖片,則將圖片利用doneBlock回傳到SDWebImageManager,然後通過completeBlockA,將圖片回傳到前端展示圖片。
12 SDWebImageManager:
如果在SDImageCache中沒有查詢到,則SDImageManager開始配置SDWebImageDownloaderOptions。
然後讓共享的下載器SDWebImageDownloader執行downloadImageWithURL:options:progress:completed:方法。
該方法progress引數為progressBlock,要回傳已接收的資料size和總的資料size;
completed引數completedBlock會回傳圖片、data、錯誤資訊、是否完成這四個值。
在SDWebImageDownloader中將下載圖片任務生成一個SDWebImageDownloaderOperation。
SDWebImageDownloaderOperation初始化方法為initWithRequest:options:progress:completed:cancelled:方法。
該方法共有3個Block:
progressBlock會回傳接收到的size和總的size
completedBlock會回傳圖片、data、錯誤資訊、是否完成這四個值
cancelledBlock無回傳值
13 SDWebImageDownloader:
將operation新增到operationQueue中,然後佇列就會執行這個operation了,之後會呼叫該operation的start方法,在SDWebImageDownloaderOperation的start方法中,構建NSURLConnection進行下載任務。
14 SDWebImageDownloaderOperation:
在NSURLConnection的代理方法中設定相應的Block回傳值。
15 SDWebImageDownloaderOperation:
在connection:didReceiveData:方法中,利用ImageIO進行了按照圖片下載進度載入效果。
16 SDWebImageDownloaderOperation:
在connectionDidFinishLoading:方法中,先取出imageData,用data生成圖片,然後去查詢網址,得知其是幾倍圖,然後進行解析度處理。此時如果image.images為空,則交給SDWebImageDecoder做圖片解碼處理,呼叫decodedImageWithImage:方法。
17 SDWebImageDownloaderOperation:
解碼完成後,將圖片通過completedBlock傳給SDWebImageDownloader,然後再通過completedBlock傳給SDWebImageManager。
18 SDWebImageManager:
如果圖片需要處理(比如旋轉),則處理之。然後將圖片存入記憶體快取和磁碟快取中。
19 SDWebImageManager:
將圖片、快取型別、是否完成、錯誤資訊、URL通過completedBlockA傳回到UIImageView+WebCache中,UIImageView對圖片進行賦值。
好複雜吧?
懶人看圖:
除了快取的回傳,其他的都要使用Block回傳資訊。所以會有很多Block。
加油~
相關文章
- SDWebImage 筆記Web筆記
- SDWebImage 快取機制(筆記)Web快取筆記
- SDWebimage(1)Web
- SDWebImage載入gif超級耗記憶體Web記憶體
- iOS 除SDWebImage之外清理記憶體中快取iOSWeb記憶體快取
- 每日隨筆記錄2016-05-13_1筆記
- 圖解SDWebImage圖解Web
- MJMJRefresh、SDWebImageWeb
- SDWebImage中文說明Web
- iOS SDWebImage 學習iOSWeb
- SDWebImage 原始碼分析Web原始碼
- SDWebImage原始碼解析Web原始碼
- SDWebImage 原始碼解析Web原始碼
- SDWebImage 的詳解Web
- SDWebImage原理小結Web
- SDWebImage原始碼剖析(-)Web原始碼
- SDWebImage清除快取Web快取
- 寫在2016年底(r11筆記第30天)筆記
- WWDC2016 Session筆記 - iOS 10 推送Notification新特性Session筆記iOS
- SDWebImage的快取策略Web快取
- SDWebImage原始碼解讀Web原始碼
- SDWebImage Source Probe: DownloaderWeb
- SDWebImage原始碼解析(三)Web原始碼
- SDWebImage原始碼解析(四)Web原始碼
- SDWebImage原始碼剖析(二)Web原始碼
- iOS開發框架--SDWebImageiOS框架Web
- CES 2016新品曝光 LG將推顯示器/筆記本筆記
- CS231n winter 2016 學習筆記lecture 1筆記
- SDWebImage載入多個圖片記憶體崩潰的問題Web記憶體
- SDWebImage原始碼閱讀(上)Web原始碼
- SDWebImage使用及原始碼分析Web原始碼
- 最新版SDWebImage的使用Web
- 印象筆記 --- 方法分享筆記筆記
- 原始碼閱讀:SDWebImage(十一)——SDImageCache原始碼Web
- 原始碼閱讀:SDWebImage(五)——SDWebImageFrame原始碼Web
- YYWebImage,SDWebImage和PINRemoteImage比較WebREM
- IOS SDWebImage實現原理詳解iOSWeb
- 原始碼閱讀:SDWebImage(十六)——SDWebImageTransition原始碼Web