關于SDWebImage
SDWebImage是一個針對圖片加載的插件庫田晚,提供了一個支持緩存的用于異步加載圖片的下載工具辅肾,特別的為常用的UI元素:UIImageView,UIButton和MKAnnotationView提供了Category類別擴展,可以作為一個很方便的工具。其中SDWebImagePrefetcher可以預先下載圖片睁壁,方便后續(xù)使用塌碌。UIImage支持的圖片格式(JPEG,PNG等等)包括GIF都可以被支持惋耙;Web圖片格式措近,包括動態(tài)的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的使用非常簡單摧冀,開發(fā)中需要的主要就是為一個UIImageView添加在線圖片,用到的函數(shù)主要就是sd_setImageWithURL函數(shù)(新版本函數(shù)名都加了sd前綴)系宫,sd_setImageWithURL函數(shù)提供了幾種重載方法索昂,包括只使用圖片URL參數(shù)的,以及設置占位圖片placeholderImage參數(shù)的等等扩借,這個函數(shù)也是框架封裝的最頂層的應用函數(shù)椒惨,開發(fā)中實際主要就用這個函數(shù)即可,以這個函數(shù)為入口潮罪,可以層層打開往底層看康谆,可以對應到SDWebImage的整個加載邏輯和流程。
#import <SDWebImage/UIImageView+WebCache.h>
使用SDWebImage框架為UIImageView加載在線圖片
[imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.***.com/***/image.jpg"]placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
SDWebImage 加載圖片的流程原理
上面的整個流程對應到SDWebImage框架內部今艺,依次會挖掘出下面幾個關鍵函數(shù)韵丑,最外層的也就是我們直接調用的sd_setImageWithURL函數(shù),以此函數(shù)為入口依次可能會調用到后面的函數(shù)虚缎,來完成上面的整個優(yōu)化加載流程,這里以其中一個入口函數(shù)為例:
sd_setImageWithURL: UIImageView(WebCache)的sd_setImageWithURL函數(shù)只是個UIView的類擴展接口函數(shù)钓株,負責調用并將參數(shù)傳給UIView(WebCache)的sd_internalSetImageWithURL函數(shù)实牡,參數(shù)這里有圖片的url和placeholder占位圖片;
sd_internalSetImageWithURL:UIView(WebCache)的sd_internalSetImageWithURL函數(shù)首先將placeholder展位圖片異步顯示轴合,然后給SDWebImageManager單例發(fā)送loadImageWithURL消息创坞,傳給它url參數(shù)讓其再給它的SDImageCache對象發(fā)送queryCacheOperationForKey消息先從本地搜索緩存圖片;
loadImageWithURL:收到loadImageWithURL消息后受葛,SDWebImageManager單例向SDImageCache對象發(fā)送queryCacheOperationForKey消息開始在本地搜索緩存圖片题涨,SDImageCache對象先對自己發(fā)送imageFromMemoryCacheForKey消息從內存中搜索圖片緩存偎谁,搜到則取出圖片并通過SDCacheQueryCompletedBlock回調返回,否則再對自己發(fā)送diskImageForKey消息去硬盤搜索圖片纲堵,搜到則取出圖片通過SDCacheQueryCompletedBlock回調返回巡雨,內存和硬盤都搜不到則只好重新下載;
downloadImageWithURL:如果本地搜索失敗席函,SDWebImageManager會新建一個SDWebImageDownloader下載器铐望,并向下載器發(fā)送downloadImageWithURL消息開始下載網(wǎng)絡圖片;下載成功并解碼后一方面將圖片緩存到本地茂附,另一方面取出圖片進行顯示正蛙。其中像圖片下載以及圖片解碼等耗時操作都是異步執(zhí)行,不會拖慢主線程营曼。
SDImageCache在初始化的時候會注冊一些消息通知乒验,在內存警告或退到后臺的時候會清理內存圖片緩存,應用結束的時候會清理掉過期的圖片蒂阱。