SDWebImage圖片二級緩存異步加載基本原理

關于SDWebImage

SDWebImage是一個針對圖片加載的插件庫,提供了一個支持緩存的用于異步加載圖片的下載工具,特別的為常用的UI元素:UIImageView,UIButton和MKAnnotationView提供了Category類別擴展,可以作為一個很方便的工具。其中SDWebImagePrefetcher可以預先下載圖片,方便后續使用。UIImage支持的圖片格式(JPEG,PNG等等)包括GIF都可以被支持;Web圖片格式,包括動態的Web圖片(使用WebP subspec)Github地址https://github.com/rs/SDWebImage

SDWebImage的幾點特性

1為UIImageView,UIButton和MKAnnotationView進行了類別擴展,添加了web圖片和緩存管理;

2是一個異步圖片下載器;

3異步的內存+硬盤緩沖以及自動的緩沖過期處理;

4后臺圖片解壓縮功能;

5可以保證相同的url(圖片的檢索key)不會被重復多次下載;

6可以保證假的無效url不會不斷嘗試去加載;

7保證主線程不會被阻塞;

8使用GCD和runtime知識;

使用方法示例

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

#import <SDWebImage/UIImageView+WebCache.h>

使用SDWebImage框架為UIImageView加載在線圖片

[imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.***.com/***/image.jpg"]placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

SDWebImage 加載圖片的流程原理


根據流程可以知道,圖片的加載采用了一種二級緩存機制,簡單概括意思就是:能從內存緩存直接取就從內存緩存取,內存緩存沒有就去硬盤緩存里取,再沒有就根據提供的URL到網上下載(下載自然會慢很多),下載的圖片還有一個解碼的過程,解碼后就可以直接用了,另外下載的圖片會保存到內存緩存和硬盤緩存,從而下次再取同樣的圖片就可以直接取了而不用重復下載。


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

sd_setImageWithURL: UIImageView(WebCache)的sd_setImageWithURL函數只是個UIView的類擴展接口函數,負責調用并將參數傳給UIView(WebCache)的sd_internalSetImageWithURL函數,參數這里有圖片的url和placeholder占位圖片;

sd_internalSetImageWithURL:UIView(WebCache)的sd_internalSetImageWithURL函數首先將placeholder展位圖片異步顯示,然后給SDWebImageManager單例發送loadImageWithURL消息,傳給它url參數讓其再給它的SDImageCache對象發送queryCacheOperationForKey消息先從本地搜索緩存圖片;

loadImageWithURL:收到loadImageWithURL消息后,SDWebImageManager單例向SDImageCache對象發送queryCacheOperationForKey消息開始在本地搜索緩存圖片,SDImageCache對象先對自己發送imageFromMemoryCacheForKey消息從內存中搜索圖片緩存,搜到則取出圖片并通過SDCacheQueryCompletedBlock回調返回,否則再對自己發送diskImageForKey消息去硬盤搜索圖片,搜到則取出圖片通過SDCacheQueryCompletedBlock回調返回,內存和硬盤都搜不到則只好重新下載;

downloadImageWithURL:如果本地搜索失敗,SDWebImageManager會新建一個SDWebImageDownloader下載器,并向下載器發送downloadImageWithURL消息開始下載網絡圖片;下載成功并解碼后一方面將圖片緩存到本地,另一方面取出圖片進行顯示。其中像圖片下載以及圖片解碼等耗時操作都是異步執行,不會拖慢主線程。

SDImageCache在初始化的時候會注冊一些消息通知,在內存警告或退到后臺的時候會清理內存圖片緩存,應用結束的時候會清理掉過期的圖片。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容