
網(wǎng)絡(luò)圖片
最近換了新的公司,已經(jīng)兩個月沒有記錄過東西了,慚愧慚愧。剛好今天在做清理緩存的功能,順便記錄一下:
通常APP中清理緩存主要分為兩大類:
1.通過SDWebImage加載的圖片文件緩存
2.通過NSFileManager計算緩存文件夾內(nèi)的緩存并清理
SD的緩存清理網(wǎng)上有很多,所以今天我這里主要寫下第二種方式;
直接貼出代碼解釋:
//清除緩存按鈕的點擊事件
//2018.08.02 注意這個路徑下東西輕易不要刪 所以不加入計算
//[self folderSizeAtPath:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject] +
CGFloat size = [self folderSizeAtPath:NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject] + [self folderSizeAtPath:NSTemporaryDirectory()];
NSString *message = size > 1 ? [NSString stringWithFormat:@"緩存%.2fM, 確定刪除?", size] : [NSString stringWithFormat:@"緩存%.2fK, 確定刪除?", size * 1024.0];
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:(UIAlertControllerStyleAlert)];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"確定" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {
//2018.08.02 注意清理的路徑 否則可能造成自動登錄設(shè)置也失效
[self cleanCaches:NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject];
[self.view makeToast:@"清除緩存成功!" duration:1.5 position:CSToastPositionCenter];
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleCancel) handler:nil];
[alert addAction:action];
[alert addAction:cancel];
dispatch_async(dispatch_get_main_queue(), ^{
[self showDetailViewController:alert sender:nil];
});
// 計算目錄大小
- (CGFloat)folderSizeAtPath:(NSString *)path{
// 利用NSFileManager實現(xiàn)對文件的管理
NSFileManager *manager = [NSFileManager defaultManager];
CGFloat size = 0;
if ([manager fileExistsAtPath:path]) {
// 獲取該目錄下的文件,計算其大小
NSArray *childrenFile = [manager subpathsAtPath:path];
for (NSString *fileName in childrenFile) {
NSString *absolutePath = [path stringByAppendingPathComponent:fileName];
size += [manager attributesOfItemAtPath:absolutePath error:nil].fileSize;
}
// 將大小轉(zhuǎn)化為M
return size / 1024.0 / 1024.0;
}
return 0;
}
// 根據(jù)路徑刪除文件
- (void)cleanCaches:(NSString *)path{
// 利用NSFileManager實現(xiàn)對文件的管理
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:path]) {
// 獲取該路徑下面的文件名
NSArray *childrenFiles = [fileManager subpathsAtPath:path];
for (NSString *fileName in childrenFiles) {
// 拼接路徑
NSString *absolutePath = [path stringByAppendingPathComponent:fileName];
// 將文件刪除
[fileManager removeItemAtPath:absolutePath error:nil];
}
}
}
這里重點講下第一步計算size大小要注意的,可以看到這里:
CGFloat size = [self folderSizeAtPath:NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject] + [self folderSizeAtPath:NSTemporaryDirectory()];
其實是傳遞兩個path路徑去計算相應(yīng)文件夾下的內(nèi)容的大小,上面注釋掉的部分其實只占用了很小的空間,但是存儲的信息確非常關(guān)鍵,比如我們平時經(jīng)常用到的NSUserDefaults中的數(shù)據(jù) 如果計算的時候加上這個路徑。并且在調(diào)用清除方法
[self cleanCaches:"路徑"];
也寫入這個路徑的話 NSUserDefaults中存儲的信息也會丟失,例如我們平??赡鼙4娴挠脩糇詣拥卿浀男畔O扥,所以這里在計算緩存size和清理時要格外注意,可根據(jù)自己的需要進(jìn)行調(diào)整。