本文基於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
複製程式碼