SDWebImage 快取機制(筆記)

LeeJTom發表於2018-03-20

本文基於V4.0.0 github.com/rs/SDWebIma…

腦圖 naotu.baidu.com/file/c9eb5d…

Disk 快取清理策略

總結:

SDWebImage 會在每次 APP 結束的時候執行清理任務。清理快取的規則分兩步進行:
第一步先清除掉過期的快取檔案。
如果清除掉過期的快取之後,空間還不夠。   
那麼就繼續按檔案時間從早到晚排序,先清除最早的快取檔案,直到剩餘空間達到要求。
複製程式碼
@interface SDImageCacheConfig : NSObject

//檔案快取的時長
@property (assign, nonatomic) NSInteger maxCacheAge;

//控制 SDImageCache 所允許的最大快取空間
@property (assign, nonatomic) NSUInteger maxCacheSize;

複製程式碼

1、maxCacheAge

maxCacheAge預設值

#import "SDImageCacheConfig.h"
static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week
複製程式碼

maxCacheAge是檔案快取的時長, SDWebImage 會註冊兩個通知:

//記憶體警告 
[[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(clearMemory)
                                                     name:UIApplicationDidReceiveMemoryWarningNotification
                                                   object:nil];
//應用結束
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(deleteOldFiles)
                                                     name:UIApplicationWillTerminateNotification
                                                   object:nil];
//應用進入後臺
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(backgroundDeleteOldFiles)
                                                     name:UIApplicationDidEnterBackgroundNotification
                                                   object:nil];
複製程式碼

分別在應用進入後臺和結束的時候,遍歷所有的快取檔案,如果快取檔案超過 maxCacheAge 中指定的時長,就會被刪除掉。

  • 是都執行此方法
- (void)deleteOldFilesWithCompletionBlock:(nullable SDWebImageNoParamsBlock)completionBlock;
複製程式碼

2、maxCacheSize

原始碼裡面並沒有對maxCacheSize設定預設值,所以在預設情況下不會對快取空間設定限制。

SDImageCache.m 534行
    // If our remaining disk cache exceeds a configured maximum size, perform a second
    // size-based cleanup pass.  We delete the oldest files first.
if (self.config.maxCacheSize > 0 && currentCacheSize > self.config.maxCacheSize) {
...
}
複製程式碼

上面程式碼中的 currentCacheSize 變數代表當前圖片快取佔用的空間。 從這裡可以看出,只有在 maxCacheSize 大於 0 並且當前快取空間大於 maxCacheSize 的時候才進行第二步的快取清理。
這也意味著SDWebImage 在預設情況下是不對我們的快取大小設限制的,理論上,APP 中的圖片快取可以佔滿整個裝置。

建議給APP設定一個合理的maxCacheSize

[SDImageCache sharedImageCache].maxCacheSize = 1024 * 1024 * 50;    // 50M
複製程式碼

相關文章