SDWebImage

緩存機制:

SDWebImage是一個很厲害的圖片緩存的框架。既ASIHttp+AsyncImage以後,我一直使用AFNetworking集成的UIImageView+AFNetworking.h,但後者對於圖片的緩存實際應用的是NSURLCache自帶的cache機制。而NSURLCache每次都要把緩存的raw  data 再轉化爲UIImage,就帶來了數據處理和內存方面的更多操做。具體的比較在這裏

SDWebImage提供了以下三個category來進行緩存。html

以最爲經常使用的UIImageView爲例:git

  1. UIImageView+WebCache:  setImageWithURL:placeholderImage:options: 先顯示 placeholderImage ,同時由SDWebImageManager 根據 URL 來在本地查找圖片。
  2. SDWebImageManager: downloadWithURL:delegate:options:userInfo: SDWebImageManager是將UIImageView+WebCache同SDImageCache連接起來的類, SDImageCache: queryDiskCacheForKey:delegate:userInfo:用來從緩存根據CacheKey查找圖片是否已經在緩存中
  3. 若是內存中已經有圖片緩存, SDWebImageManager會回調SDImageCacheDelegate : imageCache:didFindImage:forKey:userInfo:
  4. 而 UIImageView+WebCache 則回調SDWebImageManagerDelegate:  webImageManager:didFinishWithImage:來顯示圖片。
  5. 若是內存中沒有圖片緩存,那麼生成 NSInvocationOperation 添加到隊列,從硬盤查找圖片是否已被下載緩存。
  6. 根據 URLKey 在硬盤緩存目錄下嘗試讀取圖片文件。這一步是在 NSOperation 進行的操做,因此回主線程進行結果回調 notifyDelegate:
  7. 若是上一操做從硬盤讀取到了圖片,將圖片添加到內存緩存中(若是空閒內存太小,會先清空內存緩存)。SDImageCacheDelegate 回調 imageCache:didFindImage:forKey:userInfo:。進而回調展現圖片。
  8. 若是從硬盤緩存目錄讀取不到圖片,說明全部緩存都不存在該圖片,須要下載圖片,回調 imageCache:didNotFindImageForKey:userInfo:
  9. 共享或從新生成一個下載器 SDWebImageDownloader 開始下載圖片。
  10. 圖片下載由 NSURLConnection 來作,實現相關 delegate 來判斷圖片下載中、下載完成和下載失敗。
  11. connection:didReceiveData: 中利用 ImageIO 作了按圖片下載進度加載效果。
  12. connectionDidFinishLoading: 數據下載完成後交給 SDWebImageDecoder 作圖片解碼處理。
  13. 圖片解碼處理在一個 NSOperationQueue 完成,不會拖慢主線程 UI。若是有須要對下載的圖片進行二次處理,最好也在這裏完成,效率會好不少。
  14. 在主線程 notifyDelegateOnMainThreadWithInfo: 宣告解碼完成,imageDecoder:didFinishDecodingImage:userInfo: 回調給 SDWebImageDownloader。
  15. imageDownloader:didFinishWithImage: 回調給 SDWebImageManager 告知圖片下載完成。
  16. 通知全部的 downloadDelegates 下載完成,回調給須要的地方展現圖片。
  17. 將圖片保存到 SDImageCache 中,內存緩存和硬盤緩存同時保存。
  18. 寫文件到硬盤在單獨 NSInvocationOperation 中完成,避免拖慢主線程。
  19.  若是是在iOS上運行,SDImageCache 在初始化的時候會註冊notification 到 UIApplicationDidReceiveMemoryWarningNotification 以及  UIApplicationWillTerminateNotification,在內存警告的時候清理內存圖片緩存,應用結束的時候清理過時圖片。
  20. SDWebImagePrefetcher 能夠預先下載圖片,方便後續使用。

---------------------------------------------------------------------github

清除緩存:web

[[SDImageCache sharedImageCache] clearDisk];緩存

[[SDImageCache sharedImageCache] clearMemory];服務器

 

來自:http://blog.csdn.net/sqc3375177/article/details/7714573網絡

 

SDWebImage託管在github上。https://github.com/rs/SDWebImage框架

這個類庫提供一個UIImageView類別以支持加載來自網絡的遠程圖片。具備緩存管理、異步下載、同一個URL下載次數控制和優化等特徵。
使用示範的代碼:dom

UITableView使用UIImageView+WebCache類(基本應用,UIImageView的一個category)異步

前提#import導入UIImageView+WebCache.h文件,而後在tableview的cellForRowAtIndexPath:方法下:

複製代碼
 1 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
2 static NSString *MyIdentifier = @"MyIdentifier";
3 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
4 if (cell == nil) {
5 cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
6 }
7 // Here we use the new provided setImageWithURL: method to load the web image
8 [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
9 cell.textLabel.text = @"My Text";
10 return cell;
11 }
複製代碼
基本代碼:[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:方法的第三個參數帶一負值
來替代。

--------------------------------------------------------------------

1、SDWebImage介紹

一、在項目的開發過程當中,咱們常常會用到異步加載圖片的功能,先從網絡上異步下載圖片,而後經過UIImageView顯示在屏幕上。這是一個常用的功能,基本上全部的聯網應用程序都要用到的功能,如今GitHub上已經有很是成熟的框架

 

  1. SDWebImage(提供異步加載圖片、緩存管理,下載進度等,功能最齊全)
  2. EGOImageLoading(以前使用的框架,緩存管理不如SDWebImage設計簡單)
  3. AFNetworking (只提供異步加載圖片功能,無緩存管理)
這裏主要介紹SDWebImage,這個框架用的最多,在GitHub上已經給出框架的一些使用方法(詳情 https://github.com/rs/SDWebImage),咱們直接下載這個框架,運行裏面的Demo發現Xcode會報編譯錯誤,這是由於SDWebImage在項目中引用了GitHub的另一個項目libwebp的項目,若是要運行Demo網上已經給出瞭解決辦法。
 
二、咱們只是使用異步加載圖片及緩存管理的相關功能,不須要libwebp項目,新建項目,將SDWebImage目錄下的源代碼直接加到項目中
 


2、使用SDWebImage提供的類擴展實現異步加載圖片

一、SDWebImage提供了UIImageView的擴展類,只須要在頭文件中加入文件引用

 

#import "UIImageView+WebCache.h"

 

 

異步加載圖片方法:

 

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;
  • url 圖片的地址
  • placeholder   網絡圖片在還沒有加載成功時顯示的圖像

默認狀況下,SDWebImage會忽略Header中的緩存設置,將圖片以url爲key進行保存,url與圖片是一一對應關係。因此請求同一個url時,SDWebImage會從緩存中取得圖片。通常的狀況下用此方法能夠知足咱們的應用要求,可是若是你請求同一個url,而這張圖片在服務器端更新了,本地客戶端再次請求時仍是會返回緩存中的舊圖片,例如加載頭像類常常更新的圖片時,就會出現頭像不能更新的問題,因爲url與圖片一一對應,一種解決的辦法是改變部分url地址方式實現更新,不過這種方法操做起來很複雜,下面介紹一個更方便的辦法

 

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options;


咱們將第三個參數設置爲SDWebImageRefreshCached就能夠實現圖片更新操做了,使用方法很簡單,以下:

 

 

	NSURL *url = [NSURL URLWithString:@"http://www.example.com/image.png"];
    UIImage *defaultImage = [UIImage imageNamed:@"default.png"];
    [self.imageView setImageWithURL:url placeholderImage:defaultImage options:SDWebImageRefreshCached];

 

 

3、緩存的計算及清理

一、緩存計算,這裏的緩存計算,只計算SDWebImage的緩存,沙盒文件夾中的其它文件並不包括在內:

 

   [SDWebImageManager.sharedManager.imageCache 
calculateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) {
        
    }];



 

二、緩存清理

在SDWebImage中有兩種緩存,一種是磁盤緩存,一種爲內存緩存,框架都提供了相應的方法:

 

 [[[SDWebImageManager sharedManager] imageCache] clearDisk];
 [[[SDWebImageManager sharedManager] imageCache] clearMemory];

 

 

不過這裏要特別注意一下,在IOS7中你會發現使用這兩個方法緩存總清除不乾淨,即便斷網下仍是會有數據。這是由於在IOS7中,緩存機制作了修改,使用上述兩個方法只清除了SDWebImage的緩存,沒有清除系統的緩存,因此咱們能夠在清除緩存的代理中額外添加如下:

 

[[NSURLCache sharedURLCache] removeAllCachedResponses];

相關連接:

SDWebImage緩存圖片的機制(轉)

SDWebImage使用,圖片加載和緩存

SDWebImage異步加載圖片及緩存的管理與清理

SDWebImage源碼淺析

相關文章
相關標籤/搜索