1、SDWebImage介紹
一、在項目的開發過程當中,咱們常常會用到異步加載圖片的功能,先從網絡上異步下載圖片,而後經過UIImageView顯示在屏幕上。這是一個常常使用的功能,基本上全部的聯網應用程序都要用到的功能,如今GitHub上已經有很是成熟的框架。github
SDWebImage(提供異步加載圖片、緩存管理,下載進度等,功能最齊全)
EGOImageLoading(以前使用的框架,緩存管理不如SDWebImage設計簡單)
AFNetworking (只提供異步加載圖片功能,無緩存管理)
這裏主要介紹SDWebImage,這個框架用的最多,在GitHub上已經給出框架的一些使用方法(詳情https://github.com/rs/SDWebImage),咱們直接下載這個框架,運行裏面的Demo發現Xcode會報編譯錯誤,這是由於SDWebImage在項目中引用了GitHub的另一個項目libwebp的項目,若是要運行Demo網上已經給出瞭解決辦法。web
二、咱們只是使用異步加載圖片及緩存管理的相關功能,不須要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的緩存,沙盒文件夾中的其它文件並不包括在內:url
[SDWebImageManager.sharedManager.imageCache calculateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) { }];
二、緩存清理
在SDWebImage中有兩種緩存,一種是磁盤緩存,一種爲內存緩存,框架都提供了相應的方法:.net
[[[SDWebImageManager sharedManager] imageCache] clearDisk]; [[[SDWebImageManager sharedManager] imageCache] clearMemory];
不過這裏要特別注意一下,在IOS7中你會發現使用這兩個方法緩存總清除不乾淨,即便斷網下仍是會有數據。這是由於在IOS7中,緩存機制作了修改,使用上述兩個方法只清除了SDWebImage的緩存,沒有清除系統的緩存,因此咱們能夠在清除緩存的代理中額外添加如下:
[[NSURLCache sharedURLCache] removeAllCachedResponses];