SDWebImage圖片二級緩衝非同步載入基本原理

來源:互聯網
上載者:User

標籤:rip   沒有   var   函數調用   參數   開發   loader   not   自己   

關於SDWebImage

SDWebImage是一個針對圖片載入的外掛程式庫,提供了一個支援緩衝的用於非同步載入圖片的下載工具,特別的為常用的UI元素:UIImageView,UIButton和MKAnnotationView提供了Category類別擴充,可以作為一個很方便的工具。其中SDWebImagePrefetcher可以預先下載圖片,方便後續使用.

SDWebImage的Github地址為:https://github.com/rs/SDWebImage

SDWebImage的幾點特性
  • 為UIImageView,UIButton和MKAnnotationView進行了類別擴充,添加了web圖片和緩衝管理;
  • 是一個非同步圖片下載器;
  • 非同步記憶體+硬碟緩衝以及自動的緩衝到期處理;
  • 後台圖片解壓縮功能;
  • 可以保證相同的url(圖片的檢索key)不會被重複多次下載;
  • 可以保證假的無效url不會不斷嘗試去載入;
  • 保證主線程不會被阻塞;
  • 效能高;
  • 使用GCD和ARC;
支援的圖片格式
  • UIImage支援的圖片格式(JPEG,PNG等等)包括GIF都可以被支援;
  • Web圖片格式,包括動態Web圖片(使用WebP subspec)
使用方法樣本

SDWebImage的使用非常簡單,開發中需要的主要就是為一個UIImageView添加線上圖片,用到的函數主要就是sd_setImageWithURL函數(新版本函數名都加了sd首碼),sd_setImageWithURL函數提供了幾種重載方法,包括只使用圖片URL參數的,以及設定佔位圖片placeholderImage參數的等等,這個函數也是架構封裝的最頂層的應用函數,開發中實際主要就用這個函數即可,以這個函數為入口,可以層層開啟往底層看,可以對應到SDWebImage的整個載入邏輯和流程。

Objective-C:

#import <SDWebImage/UIImageView+WebCache.h>// 使用SDWebImage架構為UIImageView載入線上圖片[imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.***.com/***/image.jpg"]             placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

Swift:

imageView.sd_setImageWithURL(NSURL(string: "http://www.***.com/***/image.jpg"), placeholderImage:UIImage(imageNamed:"placeholder.png"))
SDWebImage 載入圖片的流程原理:

SDWebImage非同步載入圖片的使用非常簡單,一個函數調用即可完成,但實際上這一個函數的調用會使得架構立刻完成一系列的邏輯處理,以最高效的方式載入需要的圖片,具體載入流程邏輯如下:

根據流程可以知道,圖片的載入採用了一種二級緩衝機制,簡單概括意思就是:能從記憶體緩衝直接取就從記憶體緩衝取,記憶體緩衝沒有就去硬碟緩衝裡取,再沒有就根據提供的URL到網上下載(下載自然會慢很多),下載的圖片還有一個解碼的過程,解碼後就可以直接用了,另外下載的圖片會儲存到記憶體緩衝和硬碟緩衝,從而下次再取同樣的圖片就可以直接取了而不用重複下載。

官方的架構圖和時序圖展示:

上面的整個流程對應到SDWebImage架構內部,依次會挖掘出下面幾個關鍵函數,最外層的也就是我們直接調用的sd_setImageWithURL函數,以此函數為入口依次可能會調用到後面的函數,來完成上面的整個最佳化載入流程,這裡以其中一個入口函數為例:

  1. sd_setImageWithURL: UIImageView(WebCache)的sd_setImageWithURL函數只是個UIView的類擴充介面函數,負責調用並將參數傳給UIView(WebCache)的sd_internalSetImageWithURL函數,參數這裡有圖片的url和placeholder佔位圖片;

  2. sd_internalSetImageWithURL:UIView(WebCache)的sd_internalSetImageWithURL函數首先將placeholder展位元影像片非同步顯示,然後給SDWebImageManager單例發送loadImageWithURL訊息,傳給它url參數讓其再給它的SDImageCache對象發送queryCacheOperationForKey訊息先從本地搜尋緩衝圖片;

  3. loadImageWithURL:收到loadImageWithURL訊息後,SDWebImageManager單例向SDImageCache對象發送queryCacheOperationForKey訊息開始在本地搜尋緩衝圖片,SDImageCache對象先對自己發送imageFromMemoryCacheForKey訊息從記憶體中搜尋圖片緩衝,搜到則取出圖片並通過SDCacheQueryCompletedBlock回調返回,否則再對自己發送diskImageForKey訊息去硬碟搜尋圖片,搜到則取出圖片通過SDCacheQueryCompletedBlock回調返回,記憶體和硬碟都搜不到則只好重新下載;

  4. downloadImageWithURL:如果本地搜尋失敗,SDWebImageManager會建立一個SDWebImageDownloader下載器,並向下載器發送downloadImageWithURL訊息開始下載網狀圖片;下載成功並解碼後一方面將圖片緩衝到本地,另一方面取出圖片進行顯示。其中像圖片下載以及圖片解碼等耗時操作都是非同步執行,不會拖慢主線程。

補充說明

SDImageCache在初始化的時候會註冊一些訊息通知,在記憶體警告或退到背景時候會清理記憶體配置圖片緩衝,應用結束的時候會清理掉到期的圖片。

SDWebImage圖片二級緩衝非同步載入基本原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.