iOS-App快取資料計算與清除
阿新 • • 發佈:2018-12-06
思路:
①計算快取資料,計算整個應用程式快取資料
② 沙盒(Cache)快取(SDWebImage:幫我們做了快取)
③ 獲取cache資料夾尺寸
// 獲取Caches資料夾路徑
//NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
封裝檔案管理類,獲取資料夾尺寸
HKFileTool
NS_ASSUME_NONNULL_BEGIN /* 業務類:以後開發中用來專門處理某件事情,網路處理,快取處理 */ #define HKFileCachePath [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject] @interface HKFileTool : NSObject /** * 獲取資料夾尺寸 * * @param directoryPath 資料夾路徑 * */ + (void)getFileSize:(NSString *)directoryPath completion:(void(^)(NSInteger))completion; /** * 刪除資料夾所有檔案 * * @param directoryPath 資料夾路徑 */ + (void)removeDirectoryPath:(NSString *)directoryPath; @end NS_ASSUME_NONNULL_END
+ (void)removeDirectoryPath:(NSString *)directoryPath { // 獲取檔案管理者 NSFileManager *mgr = [NSFileManager defaultManager]; BOOL isDirectory; BOOL isExist= [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory]; if (!isExist || !isDirectory) { // 拋異常 // name:異常名稱 // reason:報錯原因 NSException *excp = [NSException exceptionWithName:@"pathError" reason:@"笨蛋 需要傳入的是資料夾路徑,並且路徑要存在" userInfo:nil]; [excp raise]; } // 獲取cache資料夾下所有檔案,不包括子路徑的子路徑 NSArray *subPaths = [mgr contentsOfDirectoryAtPath:directoryPath error:nil]; for (NSString *subPath in subPaths) { // 拼接完成全路徑 NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath]; // 刪除路徑 [mgr removeItemAtPath:filePath error:nil]; } } // 自己去計算SDWebImage做的快取 + (void)getFileSize:(NSString *)directoryPath completion:(void(^)(NSInteger))completion { // 獲取檔案管理者 NSFileManager *mgr = [NSFileManager defaultManager]; BOOL isDirectory; BOOL isExist = [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory]; if (!isExist || !isDirectory) { // 拋異常 // name:異常名稱 // reason:報錯原因 NSException *excp = [NSException exceptionWithName:@"pathError" reason:@"笨蛋 需要傳入的是資料夾路徑,並且路徑要存在" userInfo:nil]; [excp raise]; } //非同步獲取資料夾路徑 dispatch_async(dispatch_get_global_queue(0, 0), ^{ // 獲取資料夾下所有的子路徑,包含子路徑的子路徑 NSArray *subPaths = [mgr subpathsAtPath:directoryPath]; NSInteger totalSize = 0; for (NSString *subPath in subPaths) { // 獲取檔案全路徑 NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath]; // 判斷隱藏檔案 if ([filePath containsString:@".DS"]) continue; // 判斷是否資料夾 BOOL isDirectory; // 判斷檔案是否存在,並且判斷是否是資料夾 BOOL isExist = [mgr fileExistsAtPath:filePath isDirectory:&isDirectory]; if (!isExist || isDirectory) continue; // 獲取檔案屬性 // attributesOfItemAtPath:只能獲取檔案尺寸,獲取資料夾不對, NSDictionary *attr = [mgr attributesOfItemAtPath:filePath error:nil]; // 獲取檔案尺寸 NSInteger fileSize = [attr fileSize]; totalSize += fileSize; } // 計算完成回撥 dispatch_sync(dispatch_get_main_queue(), ^{ if (completion) { completion(totalSize); } }); }); } //單個圖片快取計算 - (void)getFileSize { // NSFileManager // attributesOfItemAtPath:指定檔案路徑,就能獲取檔案屬性 // 把所有檔案尺寸加起來 // 獲取Caches資料夾路徑 NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; // 獲取default檔案路徑 NSString *defaultPath = [cachePath stringByAppendingPathComponent:@"default/com.hackemist.SDWebImageCache.default/1b2ddf3a6025383675a08262439c1478.jpg"]; // 遍歷資料夾所有檔案,一個一個加起來 // 獲取檔案管理者 NSFileManager *mgr = [NSFileManager defaultManager]; // 獲取檔案屬性 // attributesOfItemAtPath:只能獲取檔案尺寸,獲取資料夾不對, NSDictionary *attr = [mgr attributesOfItemAtPath:defaultPath error:nil]; // default尺寸 NSInteger fileSize = [attr fileSize]; NSLog(@"%ld",fileSize); } @end
使用:
1.獲取資料夾尺寸
@interface HKSettingViewController () @property (nonatomic, assign) NSInteger totalSize; @end [SVProgressHUD showWithStatus:@"正在計算快取尺寸...."]; // 獲取資料夾尺寸 // 資料夾非常小,如果我的檔案非常大 HKWeakSelf [HKFileTool getFileSize:HKFileCachePath completion:^(NSInteger totalSize) { HKStrongSelf self.totalSize = totalSize; [self.tableView reloadData]; [SVProgressHUD dismiss]; }];
2.獲取快取字串
// 獲取快取尺寸字串 cell.textLabel.text = [self sizeStr]; // 獲取快取尺寸字串 - (NSString *)sizeStr { NSInteger totalSize = _totalSize; NSString *sizeStr = @"清除快取"; // MB KB B if (totalSize > 1000 * 1000) { // MB CGFloat sizeF = totalSize / 1000.0 / 1000.0; sizeStr = [NSString stringWithFormat:@"%@(%.1fMB)",sizeStr,sizeF]; } else if (totalSize > 1000) { // KB CGFloat sizeF = totalSize / 1000.0; sizeStr = [NSString stringWithFormat:@"%@(%.1fKB)",sizeStr,sizeF]; } else if (totalSize > 0) { // B sizeStr = [NSString stringWithFormat:@"%@(%.ldB)",sizeStr,totalSize]; } return sizeStr; }
3.清除快取
// 點選cell就會呼叫 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // 清空快取 // 刪除資料夾裡面所有檔案 [HKFileTool removeDirectoryPath:HKFileCachePath]; _totalSize = 0; [self.tableView reloadData]; }