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快取筆記
- MJMJRefresh、SDWebImageWeb
- 【Matlab筆記1】安裝matlab 2016a win64系統Matlab筆記
- iOS 除SDWebImage之外清理記憶體中快取iOSWeb記憶體快取
- 圖解SDWebImage圖解Web
- SDWebImage中文說明Web
- iOS SDWebImage 學習iOSWeb
- SDWebImage原始碼解析Web原始碼
- SDWebImage 原始碼分析Web原始碼
- 華為筆記本內建Office 2016怎麼啟用?華為膝上型電腦內建正版Office 2016啟用教程筆記
- SDWebImage原始碼解讀Web原始碼
- SDWebImage的快取策略Web快取
- iOS開發框架--SDWebImageiOS框架Web
- 百度筆試2016,罪犯轉移(php)筆試PHP
- SDWebImage載入多個圖片記憶體崩潰的問題Web記憶體
- 原始碼閱讀:SDWebImage(十六)——SDWebImageTransition原始碼Web
- 原始碼閱讀:SDWebImage(十三)——SDWebImageDownloader原始碼Web
- 原始碼閱讀:SDWebImage(十四)——SDWebImageManager原始碼Web
- 原始碼閱讀:SDWebImage(十五)——SDWebImagePrefetcher原始碼Web
- 原始碼閱讀:SDWebImage(二)——SDWebImageCompat原始碼Web
- 原始碼閱讀:SDWebImage(十一)——SDImageCache原始碼Web
- 原始碼閱讀:SDWebImage(八)——SDWebImageGIFCoder原始碼Web
- 原始碼閱讀:SDWebImage(九)——SDWebImageCodersManager原始碼Web
- 原始碼閱讀:SDWebImage(十)——SDImageCacheConfig原始碼Web
- 原始碼閱讀:SDWebImage(七)——SDWebImageImageIOCoder原始碼Web
- 原始碼閱讀:SDWebImage(五)——SDWebImageFrame原始碼Web
- 原始碼閱讀:SDWebImage(六)——SDWebImageCoderHelper原始碼Web
- 原始碼閱讀:SDWebImage(四)——SDWebImageCoder原始碼Web
- 原始碼閱讀:SDWebImage(十二)——SDWebImageDownloaderOperation原始碼Web
- 印象筆記 --- 方法分享筆記筆記
- SDWebImage(v3.7.6) 原始碼學習Web原始碼
- 筆記筆記
- 回顧我的 2016 — my2016()
- Lesnoe Ozero 2016. BSUIR Open 2016 FinalsUI
- 2016。2017,
- [HEOI2016/TJOI2016]排序-題解排序
- 原始碼閱讀:SDWebImage(十七)——UIView+WebCacheOperation原始碼WebUIView
- 原始碼閱讀:SDWebImage(十八)——UIView+WebCache原始碼WebUIView