一般我們項目中的緩存一般分為2大塊:一個是自己緩存的一些數據;還有一個就是我們使用的SDWebImage這個第三方庫給我們自動緩存的圖片文件緩存了。
1、僅僅清理圖片緩存
如果你只想清理圖片緩存,且是用SDWebImage加載的網絡圖片,那么你可以用SDWebImage內部封裝方法清除圖片緩存
//導入頭文件
#import <SDImageCache.h>
//獲取緩存圖片的大小(字節)
NSUInteger bytesCache = [[SDImageCache sharedImageCache] getSize];
//換算成 MB (注意iOS中的字節之間的換算是1000不是1024)
float MBCache = bytesCache/1000/1000;
//異步清除圖片緩存 (磁盤中的)
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[[SDImageCache sharedImageCache] clearDisk];
});
2、清理所有緩存文件
如果你想清理所有的緩存文件(包括圖片、視頻、音頻等), 那你可以用如下方法。需要你把caches的路徑傳過去,然后計算caches文件夾下內容的大小,然后根據其大小再判斷是否清除緩存。(根據路徑刪除文件或文件夾)
為了讓代碼看起來更整潔,這里將緩存的計算及清理封裝自定義一個工具類:
// 利用SDWebImage計算并清理緩存
#import <Foundation/Foundation.h>
@interface QTXCleanCaches : NSObject
+ (float)fileSizeAtPath:(NSString *)path;
+ (float)folderSizeAtPath:(NSString *)path;
+ (void)clearCache:(NSString *)path;
@end
#import "QTXCleanCaches.h"
#import "SDImageCache.h"
@implementation QTXCleanCaches
// 1.計算單個文件大小
+ (float)fileSizeAtPath:(NSString *)path {
NSFileManager *fileManager=[NSFileManager defaultManager];
if([fileManager fileExistsAtPath:path]){
long long size=[fileManager attributesOfItemAtPath:path error:nil].fileSize;
return size/1024.0/1024.0;
}
return 0;
}
// 2.計算文件夾大小(要利用上面的1提供的方法)
+ (float)folderSizeAtPath:(NSString *)path {
NSFileManager *fileManager=[NSFileManager defaultManager];
float folderSize;
if ([fileManager fileExistsAtPath:path]) {
NSArray *childerFiles=[fileManager subpathsAtPath:path];
for (NSString *fileName in childerFiles) {
NSString *absolutePath=[path stringByAppendingPathComponent:fileName];
folderSize += [self fileSizeAtPath:absolutePath];
}
// SDWebImage框架自身計算緩存的實現
folderSize+=[[SDImageCache sharedImageCache] getSize]/1024.0/1024.0;
return folderSize;
}
return 0;
}
// 3.清除緩存
+ (void)clearCache:(NSString *)path {
NSFileManager *fileManager=[NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:path]) {
NSArray *childerFiles=[fileManager subpathsAtPath:path];
for (NSString *fileName in childerFiles) {
//如有需要,加入條件,過濾掉不想刪除的文件
NSString *absolutePath=[path stringByAppendingPathComponent:fileName];
[fileManager removeItemAtPath:absolutePath error:nil];
}
}
[[SDImageCache sharedImageCache] cleanDisk];
}
@end
只需要在所使用的控制器里調取計算和清理緩存的方法即可:
#import "QTXSetupController.h"
#import "QTXAlterView.h"
#import "QTXCleanCaches.h"
@interface QTXSetupController () <QTXAlterViewDelegate>
@end
// 在清理緩存的點擊事件里處理
// 1.計算緩存大小
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
float size = [QTXCleanCaches folderSizeAtPath:cachesDir];
// 2.這里是我自定義的彈框QTXAlterView,可以選擇系統自帶的使用
QTXAlterView *alter = [[QTXAlterView alloc] initWithMessage:[NSString stringWithFormat:@"已清理%.2lfM緩存", size] delegate:self rightButtonTitle:@"確定" otherButtonTitles:nil];
[alter show];
// 清理緩存
[QTXCleanCaches clearCache:cachesDir];