SDWebImage3.7.5源碼閱讀三


SDWebImage3.7.5源碼閱讀二中看完後,已經知道SDWebImageCombinedOperation類的cacheOperation屬性就是在圖片下載前準備搜索一下緩存(memory、disk)做用的。html

  • 回答問題7:SDWebImageCombinedOperation的cacheOperation執行的操做是在下載前搜索圖片緩存。

3.6 下載操做

在cacheOperation搜索完緩存以後:前端

operation.cacheOperation = [self.imageCache queryDiskCacheForKey:key done:^(UIImage *image, SDImageCacheType cacheType) {

...
operation.cacheOperation = [self.imageCache queryDiskCacheForKey:key done:^(UIImage *image, SDImageCacheType cacheType) {

...//一大串 options的操做 暫時無論它

//終於見到了下載操做!
id <SDWebImageOperation> subOperation = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed
...

}

其中self.imageDownloader也是SDWebImageManager init的時候生成的,是SDWebImageDownloader對象,跳轉到downloadImageWithURL中:緩存

- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock {

__block SDWebImageDownloaderOperation *operation;
__weak __typeof(self)wself = self;

[self addProgressCallback:progressBlock completedBlock:completedBlock forURL:url createCallback:^{

//生成對應的URL
NSMutableURLRequest *request = ...

//下載進度 下載完成 取消等操做
operation = [[wself.operationClass alloc] initWithRequest ...

}];

...
//開始下載
[wself.downloadQueue addOperation:operation];

}

而後查看SDWebImageDownloaderOperation 能夠看到下載實現是靠 NSURLConnection完成的,下載進度什麼的固然就是NSURLConnectionDataDelegate裏完成的。異步

圖片下載完後有個decode操做:url

image = [UIImage decodedImageWithImage:image];

到這裏整理一下主要的流程:3d

  1. 入口 setImageWithURL:placeholderImage:options: 會先把 placeholderImage 顯示,而後 SDWebImageManager 根據 URL 開始處理圖片。
  2. 進入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交給 SDImageCache 從緩存查找圖片是否已經下載 queryDiskCacheForKey:key done:.
  3. 先從內存圖片緩存查找是否有圖片,若是內存中已經有圖片緩存 SDWebImageQueryCompletedBlock 塊返回圖片 到前端展現圖片。
  4. 若是內存緩存中沒有,GCD 異步開始從硬盤查找圖片是否已經緩存。
  5. 根據 URLKey 在硬盤緩存目錄下嘗試讀取圖片文件。 完成後在SDWebImageQueryCompletedBlock回調
  6. 若是上一操做從硬盤讀取到了圖片,圖片可能先縮放再轉碼,將圖片添加到內存緩存中
  7. 若是從硬盤緩存目錄讀取不到圖片,說明全部緩存都不存在該圖片,須要下載圖片,
    共享或從新生成一個下載器 SDWebImageDownloader 開始下載圖片。
  8. 圖片下載由 NSURLConnection 來作,實現相關 delegate 來判斷圖片下載中、下載完成和下載失敗。
    • connection:didReceiveData: 中利用 SDWebImageQueryCompletedBlock 作了按圖片下載進度加載效果。
    • connectionDidFinishLoading: 數據下載完成後交給 SDWebImageDecoder 作圖片解碼處理。
  9. 下載完成後有緩存,交給 SDWebImageDecoder 作圖片解碼操做。
相關文章
相關標籤/搜索