SDWebImage使用——一個可管理遠程圖片加載的類庫html
SDWebImage託管在github上。https://github.com/rs/SDWebImage前端
這個類庫提供一個UIImageView類別以支持加載來自網絡的遠程圖片。具備緩存管理、異步下載、同一個URL下載次數控制和優化等特徵。git
將SDWebImage類庫添加入工程時,必定注意須要添加MapKit.framework,如圖所示,由於MKAnnotationView+WebCache.h依賴該framework。github
使用示範的代碼:web
1. UITableView使用UIImageView+WebCache類(基本應用,UIImageView的一個category)緩存
前提#import導入UIImageView+WebCache.h文件,而後在tableview的cellForRowAtIndexPath:方法下:網絡
基本代碼:dom
針對iOS4+目標平臺,還可使用以下塊語句:異步
2. 使用SDWebImageManager類:能夠進行一些異步加載的工做。async
固然你的類要實現SDWebImageManagerDelegate協議,而且要實現協議的webImageManager:didFinishWithImage:方法。
3. 獨立的異步圖像下載
可能會單獨用到異步圖片下載,則必定要用downloaderWithURL:delegate:來創建一個SDWebImageDownloader實例。
這樣SDWebImageDownloaderDelegate協議的方法imageDownloader:didFinishWithImage:被調用時下載會當即開始並完成。
4. 獨立的異步圖像緩存
SDImageCache類提供一個建立空緩存的實例,並用方法imageForKey:來尋找當前緩存。
存儲一個圖像到緩存是使用方法storeImage: forKey:
默認狀況下,圖像將被存儲在內存緩存和磁盤緩存中。若是僅僅是想內存緩存中,要使用storeImage:forKey:toDisk:方法的第三個參數帶一負值
來替代。
SDWebImage託管在github上。https://github.com/rs/SDWebImage
這個類庫提供一個UIImageView類別以支持加載來自網絡的遠程圖片。具備緩存管理、異步下載、同一個URL下載次數控制和優化等特徵。
使用示範的代碼:
UITableView使用UIImageView+WebCache類(基本應用,UIImageView的一個category)
前提#import導入UIImageView+WebCache.h文件,而後在tableview的cellForRowAtIndexPath:方法下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
}
// Here we use the new provided setImageWithURL: method to load the web image
[cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
cell.textLabel.text = @"My Text";
return cell;
}
基本代碼:[imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/image.jpg"]];
使用SDWebImageManager類:能夠進行一些異步加載的工做。
SDWebImageManager *manager = [SDWebImageManager sharedManager];
UIImage *cachedImage = [manager imageWithURL:url]; // 將須要緩存的圖片加載進來
if (cachedImage) {
// 若是Cache命中,則直接利用緩存的圖片進行有關操做
// Use the cached image immediatly
} else {
// 若是Cache沒有命中,則去下載指定網絡位置的圖片,而且給出一個委託方法
// Start an async download
[manager downloadWithURL:url delegate:self];
}
固然你的類要實現SDWebImageManagerDelegate協議,而且要實現協議的webImageManager:didFinishWithImage:方法。
// 當下載完成後,調用回調方法,使下載的圖片顯示
- (void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image {
// Do something with the downloaded image
}
獨立的異步圖像下載
可能會單獨用到異步圖片下載,則必定要用downloaderWithURL:delegate:來創建一個SDWebImageDownloader實例。
downloader = [SDWebImageDownloader downloaderWithURL:url delegate:self];
這樣SDWebImageDownloaderDelegate協議的方法imageDownloader:didFinishWithImage:被調用時下載會當即開始並完成。
獨立的異步圖像緩存
SDImageCache類提供一個建立空緩存的實例,並用方法imageForKey:來尋找當前緩存。
UIImage *myCachedImage = [[SDImageCache sharedImageCache] imageFromKey:myCacheKey];
存儲一個圖像到緩存是使用方法storeImage: forKey:
[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];
默認狀況下,圖像將被存儲在內存緩存和磁盤緩存中。若是僅僅是想內存緩存中,要使用storeImage:forKey:toDisk:方法的第三個參數帶一負值
來替代。
SDWebImage 支持異步的圖片下載+緩存,提供了 UIImageView+WebCacha 的 category,方便使用。紀錄一下 SDWebImage 加載圖片的流程。
SDWebImage庫的做用:
經過對UIImageView的類別擴展來實現異步加載替換圖片的工做。
主要用到的對象:
一、UIImageView (WebCache)類別,入口封裝,實現讀取圖片完成後的回調
二、SDWebImageManager,對圖片進行管理的中轉站,記錄那些圖片正在讀取。
向下層讀取Cache(調用SDImageCache),或者向網絡讀取對象(調用SDWebImageDownloader) 。
實現SDImageCache和SDWebImageDownloader的回調。
三、SDImageCache,根據URL的MD5摘要對圖片進行存儲和讀取(實現存在內存中或者存在硬盤上兩種實現)
實現圖片和內存清理工做。
四、SDWebImageDownloader,根據URL向網絡讀取數據(實現部分讀取和所有讀取後再通知回調兩種方式)
其餘類:
SDWebImageDecoder,異步對圖像進行了一次解壓⋯⋯
目前不明白爲何要作這麼道工序。(如今清楚了,功能解釋見下文)
有趣的點:
一、SDImageCache是怎麼作數據管理的?
SDImageCache分兩個部分,一個是內存層面的,一個是硬盤層面的。
內存層面的至關是個緩存器,以Key-Value的形式存儲圖片。當內存不夠的時候會清除全部緩存圖片。
用搜索文件系統的方式作管理,文件替換方式是以時間爲單位,剔除時間大於一週的圖片文件。
當SDWebImageManager向SDImageCache要資源時,先搜索內存層面的數據,若是有直接返回,沒有的話去訪問磁盤,將圖片從磁盤讀取出來,而後作Decoder,將圖片對象放到內存層面作備份,再返回調用層。
二、爲啥必須作Decoder?
經過這個博客:http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/
如今明白了,因爲UIImage的imageWithData函數是每次畫圖的時候纔將Data解壓成ARGB的圖像,
因此在每次畫圖的時候,會有一個解壓操做,這樣效率很低,可是隻有瞬時的內存需求。
爲了提升效率經過SDWebImageDecoder將包裝在Data下的資源解壓,而後畫在另一張圖片上,這樣這張新圖片就再也不須要重複解壓了。
這種作法是典型的空間換時間的作法。