1. 程式人生 > >iOS-App快取資料計算與清除

iOS-App快取資料計算與清除

思路: 

①計算快取資料,計算整個應用程式快取資料 

② 沙盒(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];
}