iOS開發(fā) - 清除緩存

  • Bg

1)由于項(xiàng)目需求需要,需要在設(shè)置頁(yè)面其中一個(gè)cell里面展示緩存大小哩照,并提供清除緩存功能挺物,發(fā)現(xiàn)之前自己一直使用的那個(gè)計(jì)算并清除緩存的方法并不完善,而且一直都有想要完善一下的想法飘弧,由此寫下這篇文章识藤,提供給有需要幫助的朋友參考
2)代碼的話就只提供一個(gè)簡(jiǎn)版的工具類了,使用很簡(jiǎn)單次伶,也簡(jiǎn)單說明下

  • 先看下簡(jiǎn)單的效果圖


    cache.gif
  • 簡(jiǎn)單介紹

現(xiàn)在這個(gè)功能已經(jīng)被抽成一個(gè)簡(jiǎn)單的工具類痴昧,既然是工具類,那么就先說明下如何使用

  • 獲取文件夾大小

1)既然清除緩存就需要先計(jì)算緩存冠王,工具類里面提供了一個(gè)計(jì)算緩存大小的類方法赶撰,你只需要提供一個(gè)需要計(jì)算的文件夾路徑

/**
 *  @author li bo, 16/05/29
 *
 *  獲取path路徑文件夾的大小
 *
 *  @param path 要獲取大小的文件夾全路徑
 *
 *  @return 返回path路徑文件夾的大小
 */
+ (NSString *)getCacheSizeWithFilePath:(NSString *)path;

2)一般顯示緩存大小都是在cell上的label里面,這個(gè)label可以是使用系統(tǒng)的可以自己添加的,這里提供一個(gè)簡(jiǎn)單版的使用

 在tableView的cellForRowAtIndexPath這個(gè)方法里面
    if (indexPath.row==0)  //如果是清除緩存對(duì)應(yīng)的這個(gè)cell
   {
       NSString *fileSize = [LBClearCacheTool getCacheSizeWithFilePath:filePath];

        if ([fileSize integerValue] == 0)//如果沒有緩存豪娜,那么不需要顯示緩存大小
       {
       cell.textLabel.text = @"清除緩存";
       }else //緩存大小不為0餐胀,顯示緩存大小
       {
       cell.textLabel.text = [NSString stringWithFormat:@"清除緩存(%@)",fileSize];
       }
    }

3)獲取文件夾大小部分代碼實(shí)現(xiàn)

//調(diào)試
#ifdef DEBUG
    //如果文件夾不存在或者不是一個(gè)文件夾那么就拋出一個(gè)異常
    //拋出異常會(huì)導(dǎo)致程序閃退,所以只在調(diào)試階段拋出瘤载,發(fā)布階段不要再拋了,不然極度影響用戶體驗(yàn)
    BOOL isDirectory = NO;
    BOOL isExist = [fileManager fileExistsAtPath:path isDirectory:&isDirectory];
    if (!isExist || !isDirectory)
    {
        NSException *exception = [NSException exceptionWithName:@"fileError" reason:@"please check your filePath!" userInfo:nil];
        [exception raise];

    }
    NSLog(@"debug");
//發(fā)布
#else
    NSLog(@"post");
#endif


//以上判斷目的是忽略不需要計(jì)算的文件
        if (!isExist || isDirectory || [filePath containsString:@".DS"]) continue;
            //NSLog(@"%@",filePath);
            //指定路徑骂澄,獲取這個(gè)路徑的屬性
            //attributesOfItemAtPath:需要傳文件夾路徑
            //但是attributesOfItemAtPath 只可以獲得文件屬性,不可以獲得文件夾屬性惕虑,這個(gè)也就是需要for-in遍歷文件夾里面每一個(gè)文件的原因
            NSDictionary *dict=   [fileManager attributesOfItemAtPath:filePath error:nil];

            NSInteger size=[dict[@"NSFileSize"] integerValue];
            totleSize+=size;
     }

清除文件夾緩存

1)既然要清除坟冲,工具類里面也提供了一個(gè)清除文件夾緩存的類方法,需要辛苦你操作的依然是提供你需要清除緩存的文件夾全路徑

/**
 *  @author li bo, 16/05/29
 *
 *  清除path路徑文件夾的緩存
 *
 *  @param path  要清除緩存的文件夾全路徑
 *
 *  @return 是否清除成功
 */
+ (BOOL)clearCacheWithFilePath:(NSString *)path;

2)一般清除緩存都是在我們點(diǎn)擊了對(duì)應(yīng)這一行cell的時(shí)候才會(huì)去執(zhí)行的溃蔫,這里就在cell被點(diǎn)擊的方法里面執(zhí)行對(duì)應(yīng)的清除操作

在tableView的didSelectRowAtIndexPath方法中執(zhí)行
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   if (indexPath.row == 0) {//如果是需要清除緩存對(duì)應(yīng)的cell

       UIAlertController *alert=[UIAlertController alertControllerWithTitle:@"確定清除緩存嗎?" message:nil preferredStyle:UIAlertControllerStyleActionSheet];

       //創(chuàng)建一個(gè)取消和一個(gè)確定按鈕
       UIAlertAction *actionCancle=[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
       //因?yàn)樾枰c(diǎn)擊確定按鈕后改變文字的值健提,所以需要在確定按鈕這個(gè)block里面進(jìn)行相應(yīng)的操作
       UIAlertAction *actionOk=[UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {

           //清楚緩存
          BOOL isSuccess = [LBClearCacheTool clearCacheWithFilePath:filePath];
           if (isSuccess)  //如果清除成功
          { 
               //刷新指定行,讓cell更新緩存大小這個(gè)狀態(tài)
               [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
               //來(lái)一個(gè)指示器伟叛,提示清除成功私痹,這樣用戶體驗(yàn)比較好
               [SVProgressHUD setDefaultStyle:SVProgressHUDStyleDark];
               [SVProgressHUD showSuccessWithStatus:@"清除成功"];

               //彈框提示1秒后,把這個(gè)彈框消失统刮,默認(rèn)的消失時(shí)間有點(diǎn)長(zhǎng)
               dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                   [SVProgressHUD dismiss];
               });
           }
      }];
       //將取消和確定按鈕添加進(jìn)彈框控制器
       [alert addAction:actionCancle];
       [alert addAction:actionOk];
     
        //顯示彈框控制器
       [self presentViewController:alert animated:YES completion:nil];
   }

}

3)清除緩存功能部分代碼實(shí)現(xiàn)

/拿到path路徑的下一級(jí)目錄的子文件夾
    NSArray *subpathArray = [fileManager contentsOfDirectoryAtPath:path error:nil];

 //刪除子文件夾
        [fileManager removeItemAtPath:filePath error:&error];
        if (error) {
            message = [NSString stringWithFormat:@"%@這個(gè)路徑的文件夾刪除失敗了紊遵,請(qǐng)檢查后重新再試",filePath];
            return NO;

        }else {
            message = @"成功了";
        }

OK,文章暫時(shí)寫到這里啦侥蒙,上班時(shí)間還要專心工作滴暗膜,具體的獲取緩存大小以及清除緩存功能的實(shí)現(xiàn),包括這個(gè)工具類鞭衩,由于文字解釋比較詳細(xì)学搜,如果感興趣的朋友,大家可以直接下載代碼查看论衍,另外大家沒事可以多參考SD_Webimage源碼瑞佩,里面很多好東西的哦,它里面其實(shí)就有比較好的計(jì)算以及清除緩存的功能的坯台。
另外參考?xì)g迎交流炬丸,感謝支持。
可以點(diǎn)擊這里進(jìn)行下載
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜒蕾,一起剝皮案震驚了整個(gè)濱河市稠炬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滥搭,老刑警劉巖酸纲,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捣鲸,死亡現(xiàn)場(chǎng)離奇詭異瑟匆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門愁溜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疾嗅,“玉大人,你說我怎么就攤上這事冕象〈校” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵渐扮,是天一觀的道長(zhǎng)论悴。 經(jīng)常有香客問我,道長(zhǎng)墓律,這世上最難降的妖魔是什么膀估? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮耻讽,結(jié)果婚禮上察纯,老公的妹妹穿的比我還像新娘。我一直安慰自己针肥,他們只是感情好饼记,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慰枕,像睡著了一般具则。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上具帮,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天乡洼,我揣著相機(jī)與錄音,去河邊找鬼匕坯。 笑死束昵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的葛峻。 我是一名探鬼主播锹雏,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼术奖!你這毒婦竟也來(lái)了礁遵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤采记,失蹤者是張志新(化名)和其女友劉穎佣耐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唧龄,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兼砖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讽挟。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懒叛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耽梅,到底是詐尸還是另有隱情薛窥,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布眼姐,位于F島的核電站诅迷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏众旗。R本人自食惡果不足惜竟贯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逝钥。 院中可真熱鬧屑那,春花似錦、人聲如沸艘款。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哗咆。三九已至蜘欲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晌柬,已是汗流浹背姥份。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留年碘,地道東北人澈歉。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像屿衅,于是被迫代替她去往敵國(guó)和親埃难。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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