2016筆記——SDWebImage

weixin_33912445發表於2018-07-27

之前覺得SDWebImage很好用,可以直接下載下來,放到檔案中,匯入標頭檔案“UIImageView+WebCache.h”即可使用。

711728-bf044e552f950409.png
螢幕快照 2016-05-25 17.15.40.png

效果:

711728-46cd992a092d53be.png
Simulator Screen Shot 2016年5月25日 17.16.00.png

但是他究竟幹了啥,之前並不知曉,今天好好研究研究:

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對圖片進行賦值。

好複雜吧?

懶人看圖:

711728-561768a18031dc54.png
螢幕快照 2016-03-31 15.02.15.png

除了快取的回傳,其他的都要使用Block回傳資訊。所以會有很多Block。

加油~

相關文章