iOS开发 - 清除缓存

  • Bg

1)由于项目需求需要,需要在设置页面其中一个cell里面展示缓存大小,并提供清除缓存功能,发现之前自己一直使用的那个计算并清除缓存的方法并不完善,而且一直都有想要完善一下的想法,由此写下这篇文章,提供给有需要帮助的朋友参考
2)代码的话就只提供一个简版的工具类了,使用很简单,也简单说明下

  • 先看下简单的效果图


    cache.gif
  • 简单介绍

现在这个功能已经被抽成一个简单的工具类,既然是工具类,那么就先说明下如何使用

  • 获取文件夹大小

1)既然清除缓存就需要先计算缓存,工具类里面提供了一个计算缓存大小的类方法,你只需要提供一个需要计算的文件夹路径

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

2)一般显示缓存大小都是在cell上的label里面,这个label可以是使用系统的可以自己添加的,这里提供一个简单版的使用

 在tableView的cellForRowAtIndexPath这个方法里面
    if (indexPath.row==0)  //如果是清除缓存对应的这个cell
   {
       NSString *fileSize = [LBClearCacheTool getCacheSizeWithFilePath:filePath];

        if ([fileSize integerValue] == 0)//如果没有缓存,那么不需要显示缓存大小
       {
       cell.textLabel.text = @"清除缓存";
       }else //缓存大小不为0,显示缓存大小
       {
       cell.textLabel.text = [NSString stringWithFormat:@"清除缓存(%@)",fileSize];
       }
    }

3)获取文件夹大小部分代码实现

//调试
#ifdef DEBUG
    //如果文件夹不存在或者不是一个文件夹那么就抛出一个异常
    //抛出异常会导致程序闪退,所以只在调试阶段抛出,发布阶段不要再抛了,不然极度影响用户体验
    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");
//发布
#else
    NSLog(@"post");
#endif


//以上判断目的是忽略不需要计算的文件
        if (!isExist || isDirectory || [filePath containsString:@".DS"]) continue;
            //NSLog(@"%@",filePath);
            //指定路径,获取这个路径的属性
            //attributesOfItemAtPath:需要传文件夹路径
            //但是attributesOfItemAtPath 只可以获得文件属性,不可以获得文件夹属性,这个也就是需要for-in遍历文件夹里面每一个文件的原因
            NSDictionary *dict=   [fileManager attributesOfItemAtPath:filePath error:nil];

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

清除文件夹缓存

1)既然要清除,工具类里面也提供了一个清除文件夹缓存的类方法,需要辛苦你操作的依然是提供你需要清除缓存的文件夹全路径

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

2)一般清除缓存都是在我们点击了对应这一行cell的时候才会去执行的,这里就在cell被点击的方法里面执行对应的清除操作

在tableView的didSelectRowAtIndexPath方法中执行
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   if (indexPath.row == 0) {//如果是需要清除缓存对应的cell

       UIAlertController *alert=[UIAlertController alertControllerWithTitle:@"确定清除缓存吗?" message:nil preferredStyle:UIAlertControllerStyleActionSheet];

       //创建一个取消和一个确定按钮
       UIAlertAction *actionCancle=[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
       //因为需要点击确定按钮后改变文字的值,所以需要在确定按钮这个block里面进行相应的操作
       UIAlertAction *actionOk=[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {

           //清楚缓存
          BOOL isSuccess = [LBClearCacheTool clearCacheWithFilePath:filePath];
           if (isSuccess)  //如果清除成功
          { 
               //刷新指定行,让cell更新缓存大小这个状态
               [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
               //来一个指示器,提示清除成功,这样用户体验比较好
               [SVProgressHUD setDefaultStyle:SVProgressHUDStyleDark];
               [SVProgressHUD showSuccessWithStatus:@"清除成功"];

               //弹框提示1秒后,把这个弹框消失,默认的消失时间有点长
               dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                   [SVProgressHUD dismiss];
               });
           }
      }];
       //将取消和确定按钮添加进弹框控制器
       [alert addAction:actionCancle];
       [alert addAction:actionOk];
     
        //显示弹框控制器
       [self presentViewController:alert animated:YES completion:nil];
   }

}

3)清除缓存功能部分代码实现

/拿到path路径的下一级目录的子文件夹
    NSArray *subpathArray = [fileManager contentsOfDirectoryAtPath:path error:nil];

 //删除子文件夹
        [fileManager removeItemAtPath:filePath error:&error];
        if (error) {
            message = [NSString stringWithFormat:@"%@这个路径的文件夹删除失败了,请检查后重新再试",filePath];
            return NO;

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

OK,文章暂时写到这里啦,上班时间还要专心工作滴,具体的获取缓存大小以及清除缓存功能的实现,包括这个工具类,由于文字解释比较详细,如果感兴趣的朋友,大家可以直接下载代码查看,另外大家没事可以多参考SD_Webimage源码,里面很多好东西的哦,它里面其实就有比较好的计算以及清除缓存的功能的。
另外参考欢迎交流,感谢支持。
可以点击这里进行下载
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容