天天看點

SDWebImage異步加載圖檔及緩存的管理與清理一、SDWebImage介紹二、使用SDWebImage提供的類擴充實作異步加載圖檔三、緩存的計算及清理

一、SDWebImage介紹

1、在項目的開發過程中,我們經常會用到異步加載圖檔的功能,先從網絡上異步下載下傳圖檔,然後通過UIImageView顯示在螢幕上。這是一個經常使用的功能,基本上所有的聯網應用程式都要用到的功能,現在GitHub上已經有非常成熟的架構

  1. SDWebImage(提供異步加載圖檔、緩存管理,下載下傳進度等,功能最齊全)
  2. EGOImageLoading(之前使用的架構,緩存管理不如SDWebImage設計簡單)
  3. AFNetworking (隻提供異步加載圖檔功能,無緩存管理)

這裡主要介紹SDWebImage,這個架構用的最多,在GitHub上已經給出架構的一些使用方法(詳情https://github.com/rs/SDWebImage),我們直接下載下傳這個架構,運作裡面的Demo發現Xcode會報編譯錯誤,這是因為SDWebImage在項目中引用了GitHub的另外一個項目libwebp的項目,如果要運作Demo網上已經給出了解決辦法。

2、我們隻是使用異步加載圖檔及緩存管理的相關功能,不需要libwebp項目,建立項目,将SDWebImage目錄下的源代碼直接加到項目中

SDWebImage異步加載圖檔及緩存的管理與清理一、SDWebImage介紹二、使用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];
           

繼續閱讀