iOS之刪除緩存

為什么要清楚緩存

使用SDWebImage或者AFN都是會有緩存的問題,但是一旦圖片的這些東西多了攀圈,都積壓到緩存文件中去屿聋,這會占用手機的內(nèi)存資源,所以有必要在程序中添加刪除緩存文件的方法或操作浅缸。
相關(guān)的原始文件:https://github.com/gouziqiaoqiao/DeleteBuffer.git
有什么不對的地方,請各位大神指出魄咕。衩椒。。

1.首先明確緩存

明確緩存的意思是知道緩存到底是存放在什么地方的,我們可以在沙盒路徑下查找毛萌。
要知道沙盒目錄下有三個文件夾苟弛,一是Document,二是Library阁将,三是tmp膏秫。而緩存文件一般是存放在Library文件夾下的Caches文件中的,這里里面會放到一些從網(wǎng)絡(luò)請求下來的圖片資源或者是數(shù)據(jù)庫的文件冀痕。
那么找到這些文件的方法可以有,打印沙盒路徑進行查找:

NSString *path = [NSString stringWithFormat:@"%@/Library/Caches", NSHomeDirectory()];

或者是使用簡單粗暴的方式直接找到緩存文件的路徑荔睹,不用進行拼接:

[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]

2.刪除緩存文件

找到了緩存文件存放的位置就可以對這些文件進行操作了。
操作文件需要獲取文件管理者:

NSFileManager *mgr = [NSFileManager defaultManager];

接下來就是需要判斷緩存路徑是否存在言蛇,如果不存在的話就應(yīng)該拋個異常出來玩玩,如果找到了就執(zhí)行刪除文件的任務(wù)宵距,這樣的話顯得邏輯要縝密一些腊尚。
先拋個異常:

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];
}

其實到這這里,只需要調(diào)用響應(yīng)的方法就可以刪除緩存了满哪,刪除緩存就算操作完成了婿斥,但是有的時候可以在刪除緩存的時候提醒用戶,App現(xiàn)目前到底有多大的緩存哨鸭,如果沒有緩存的話民宿,用戶還在進行操作的話,是沒有意義的像鸡,所以可以適當(dāng)考慮下加上緩存文件的大小用于告知用戶活鹰。

3.計算緩存文件的大小

其實這里計算換文件的大小不影響我們緩存文件的操作,只是對用戶展示只估,當(dāng)前App的緩存文件有多大志群,只是一個告知的功能,這一步的操作應(yīng)該是放在刪除緩存之前進行的蛔钙,這樣的邏輯才是順暢的锌云。
這里是要計算緩存的大小,肯定也算是對文件的操作吁脱,也需要拿到文件管理者桑涎,同樣是要判斷路徑是否存在,同樣也是可以拋個異常的兼贡。
但是一旦確認路徑確實是存在后攻冷,就應(yīng)該執(zhí)行的是計算文件大小的操作。計算文件大小紧显,應(yīng)該是一個耗時操作讲衫,如果文件很大,耗時肯定越長,所以這應(yīng)該是放到多線程中去進行操作涉兽。

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];
    // 獲取文件尺寸
    totalSize += fileSize;
  }
  // 計算完成回調(diào)(為了避免計算大的文件夾,比較耗時,如果直接返回結(jié)果,控制器跳轉(zhuǎn)的時候回產(chǎn)生卡頓,所以采用block回調(diào)的方式)
  dispatch_sync(dispatch_get_main_queue(), ^{
    if (completion) {
      completion(totalSize);
    }
  });
});

對于得到這個totalSize 來說招驴,可以進一步的操作,不然用戶對于一長串的數(shù)字也是蒙圈的枷畏,所以我們可以對獲取到數(shù)字轉(zhuǎn)成用戶能夠看懂的M,kB,B之類的别厘;

- (NSString *)sizeStr {
    NSInteger totalSize = _totalSize;
    NSString *sizeStr = @"0.0B";
    // MB KB B
    if (totalSize > 1000 * 1000) {
        // MB
        CGFloat sizeF = totalSize / 1000.0 / 1000.0;
        sizeStr = [NSString stringWithFormat:@"%.1fMB", sizeF];
    } else if (totalSize > 1000) {
        // KB
        CGFloat sizeF = totalSize / 1000.0;
        sizeStr = [NSString stringWithFormat:@"%.1fKB", sizeF];
    } else if (totalSize > 0) {
        // B
        sizeStr = [NSString stringWithFormat:@"%.ldB", totalSize];
    }
    return sizeStr;
}

只需要在適合的位置進行調(diào)用下這個方法,然后在合適的時間對視圖進行刷新就可以了拥诡。既然刪除之前有文件大小的提示触趴,那么在刪除文件之后也應(yīng)該有相應(yīng)的視圖刷新,不然用戶體驗也不怎么好渴肉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冗懦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仇祭,更是在濱河造成了極大的恐慌披蕉,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乌奇,死亡現(xiàn)場離奇詭異没讲,居然都是意外死亡,警方通過查閱死者的電腦和手機礁苗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門爬凑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人试伙,你說我怎么就攤上這事嘁信。” “怎么了迁霎?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵吱抚,是天一觀的道長。 經(jīng)常有香客問我考廉,道長秘豹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任昌粤,我火速辦了婚禮既绕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涮坐。我一直安慰自己凄贩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布袱讹。 她就那樣靜靜地躺著疲扎,像睡著了一般昵时。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上椒丧,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天壹甥,我揣著相機與錄音,去河邊找鬼壶熏。 笑死句柠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棒假。 我是一名探鬼主播溯职,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帽哑!你這毒婦竟也來了谜酒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤祝拯,失蹤者是張志新(化名)和其女友劉穎甚带,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佳头,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年晴氨,在試婚紗的時候發(fā)現(xiàn)自己被綠了康嘉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡籽前,死狀恐怖亭珍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枝哄,我是刑警寧澤肄梨,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站挠锥,受9級特大地震影響众羡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蓖租,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一粱侣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蓖宦,春花似錦齐婴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春诱担,著一層夾襖步出監(jiān)牢的瞬間淮捆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工漏峰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留障陶,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓匀哄,卻偏偏與公主長得像秦效,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子涎嚼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容