一、SDWebImage介紹
1、在項目的開發過程中,我們經常會用到異步加載圖檔的功能,先從網絡上異步下載下傳圖檔,然後通過UIImageView顯示在螢幕上。這是一個經常使用的功能,基本上所有的聯網應用程式都要用到的功能,現在GitHub上已經有非常成熟的架構
- SDWebImage(提供異步加載圖檔、緩存管理,下載下傳進度等,功能最齊全)
- EGOImageLoading(之前使用的架構,緩存管理不如SDWebImage設計簡單)
- AFNetworking (隻提供異步加載圖檔功能,無緩存管理)
這裡主要介紹SDWebImage,這個架構用的最多,在GitHub上已經給出架構的一些使用方法(詳情https://github.com/rs/SDWebImage),我們直接下載下傳這個架構,運作裡面的Demo發現Xcode會報編譯錯誤,這是因為SDWebImage在項目中引用了GitHub的另外一個項目libwebp的項目,如果要運作Demo網上已經給出了解決辦法。
2、我們隻是使用異步加載圖檔及緩存管理的相關功能,不需要libwebp項目,建立項目,将SDWebImage目錄下的源代碼直接加到項目中
二、使用SDWebImage提供的類擴充實作異步加載圖檔
1、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];
三、緩存的計算及清理
1、緩存計算,這裡的緩存計算,隻計算SDWebImage的緩存,沙盒檔案夾中的其它檔案并不包括在内:
[SDWebImageManager.sharedManager.imageCache
calculateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) {
}];
2、緩存清理
在SDWebImage中有兩種緩存,一種是磁盤緩存,一種為記憶體緩存,架構都提供了相應的方法:
[[[SDWebImageManager sharedManager] imageCache] clearDisk];
[[[SDWebImageManager sharedManager] imageCache] clearMemory];
不過這裡要特别注意一下,在IOS7中你會發現使用這兩個方法緩存總清除不幹淨,即使斷網下還是會有資料。這是因為在IOS7中,緩存機制做了修改,使用上述兩個方法隻清除了SDWebImage的緩存,沒有清除系統的緩存,是以我們可以在清除緩存的代理中額外添加以下:
[[NSURLCache sharedURLCache] removeAllCachedResponses];