APP清除缓存功能的具体实现

本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

几乎每一个 App 都有清除缓存的功能, 不然沙盒中的文件太多, 是很占用用户的资源的, 一个简单的清除缓存的功能我们可以单独用一个类来实现.

清除缓存的功能说白了就是讲沙盒中的 Cache 文件夹中的所有子文件和子文件夹全部删除, 在项目当中, 还需要向用户展示缓存的大小, 这就涉及到要计算文件的大小.

所以, 我们的任务就是, 计算沙盒中 Cache 文件的大小, 并将其子文件和子文件夹删除

  • 首先我们建一个工具类
清除缓存工具类
  • 我们在工具类中建一个单例方法
+ (instancetype)yf_sharedManager {
    static YFWipeCacheManager *manager;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[YFWipeCacheManager alloc] init];
    });
    return manager;
}
  • 暴露一个对象方法, 根据路径计算文件大小
    其实我们这个类的目的除了清除缓存之外, 还有一个功能就是可以计算任何路径下的文件及文件夹的大小
#pragma mark - 计算单个文件的大小
- (CGFloat)yf_fileSizeAtPath:(NSString *)path {
     /* 如果这个路径文件存在的话, 就计算出文件的大小并返回, 否则就返回0 */
    if ([kFileManager fileExistsAtPath:path]) {
        unsigned long long size = [kFileManager attributesOfItemAtPath:path error:NULL].fileSize;
        return size / 1024.0 / 1024.0;
    }
    return 0;
}
  • 计算缓存文件夹中的文件大小
    因为苹果没有提供 API 直接计算文件夹的大小, 那么我们就需要遍历整个文件夹,来计算文件夹下单个文件的大小
#pragma mark - 计算缓存文件夹的大小
 /* 因为苹果没有提供 API 直接计算文件夹的大小, 那么我们就需要遍历整个文件夹,来计算文件夹下单个文件的大小 */
- (CGFloat)yf_cacheSize {
    /* 先将属性 cacheSize 的大小置为0,这样每次计算的文件夹大小的时候就不会重复累加 */
    self.cacheSize = 0;
    NSDirectoryEnumerator *enumerator = [kFileManager enumeratorAtPath:kCachePath];
    __weak typeof(self)weakSelf = self;
     /* 遍历 cache 文件夹路径中的子路径,然后计算每单个文件的大小,累加后返回 */
    [enumerator.allObjects enumerateObjectsUsingBlock:^(NSString *subPath, NSUInteger idx, BOOL * _Nonnull stop) {
        NSString *path = [kCachePath stringByAppendingPathComponent:subPath];
        weakSelf.cacheSize += [self yf_fileSizeAtPath:path];
    }];
    return self.cacheSize;
}
  • 计算其他文件夹的大小
    方法同计算 cache 文件夹大小一样
#pragma mark - 计算其他文件夹的大小 
 /* 方法同计算 cache 文件夹大小 */
- (CGFloat)yf_folderSizeAtPath:(NSString *)path {
    CGFloat folderSize = 0;
    __block CGFloat blockFolderSize = folderSize;
    if ([kFileManager fileExistsAtPath:path]) {
        NSDirectoryEnumerator *enumerator = [kFileManager enumeratorAtPath:path];
        [enumerator.allObjects enumerateObjectsUsingBlock:^(NSString *subPath, NSUInteger idx, BOOL * _Nonnull stop) {
            NSString *absolutePath = [path stringByAppendingPathComponent:subPath];
            blockFolderSize += [self yf_fileSizeAtPath:absolutePath];
        }];
        return folderSize;
    }
    return 0;
}

  • 我们除了要计算缓存文件的大小, 最重要的是要删除这些缓存文件
    清除缓存文件是一个耗时操作, 我们需要开启一个异步操作, 即开启子线程
#pragma mark - 清除缓存文件
- (void)yf_wipeCacheAction {
     /* 清除缓存文件是一个耗时操作, 我们需要开启一个异步操作 */
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         /* 在这个 block 中, 方法跟计算 cache 文件夹的大小一样, 只不过最后是清除文件 */
        NSDirectoryEnumerator *enumerator = [kFileManager enumeratorAtPath:kCachePath];
        [enumerator.allObjects enumerateObjectsUsingBlock:^(NSString *subPath, NSUInteger idx, BOOL * _Nonnull stop) {
            /* 错误处理 */
            NSError *error = nil;
            NSString *path = [kCachePath stringByAppendingPathComponent:subPath];
            if ([kFileManager fileExistsAtPath:path]) {
                [kFileManager removeItemAtPath:path error:&error];
                if (error) {
                    NSLog(@"文件删除失败");
                }else {
                    NSLog(@"文件删除成功");
                }
            }
        }];
    });
}
  • 在实际的项目中, 我们可以暴露一个类方法, 实现一键式地清除缓存
    包含以下几个步骤
    1.弹出蒙版, 计算缓存文件夹的大小
    2.弹出提示框, 提示用户是否要清除缓存
    3.当用户点击取消按钮时,不做任何操作
    4.当用户点击确定按钮时,清除缓存,并提示用户缓存清除成功
#pragma mark - 最后暴露一个类方法, 只要调用这个,自动弹出清除缓存提示框, 需要同 MBProgressHud 配合使用

+ (void)yf_wipeCacheWithDefaultStyle {
    MBProgressHUD *hud = [MBProgressHUD showHudTo:kTopStackController.view image:nil text:@"正在计算缓存大小" animated:YES];
     /* 由于计算缓存大小也是一个耗时操作. 我们做一个延时. 来确保获取到数据 */
    __weak typeof(self)weakSelf = self;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        UIAlertController *alterVC = [UIAlertController alertControllerWithTitle:@"清除缓存" message:[NSString stringWithFormat:@"APP当前的缓存为:%.2fM",[[weakSelf yf_sharedManager] yf_cacheSize]] preferredStyle:UIAlertControllerStyleActionSheet];
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
            [kTopStackController dismissViewControllerAnimated:YES completion:nil];
        }];
        UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
            [[weakSelf yf_sharedManager] yf_wipeCacheAction];
            MBProgressHUD *clearHud = [MBProgressHUD showHudTo:kTopStackController.view image:nil text:@"清除成功" animated: YES];
            clearHud.mode = MBProgressHUDModeText;
            [clearHud hide:YES afterDelay:2.0];
        }];
        [alterVC addAction:cancelAction];
        [alterVC addAction:confirmAction];
        [kTopStackController presentViewController:alterVC animated:YES completion:nil];
    });
    [hud hide:YES afterDelay:1.0];
}

所以这个类最基础的使用方法就是在按钮的点击事件中加入这样一句代码

[YFWipeCacheManager yf_wipeCacheWithDefaultStyle];

不过有一点不方便的是, 必须要和 MBProgressHUD 这个第三方框架联合使用, 如果大家不想这么做的话, 也无需理会, 用这个类中的其他方法配合自定义, 也能够实现类似的效果.

下面就是实现的效果图:

清除缓存实现效果图

下面是清除缓存类的打包链接, 大家拖过去就直接可以使用.非常方便

清除缓存类的下载链接

PS. 本人有若干成套学习视频, 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,567评论 25 707
  • 设置界面�中清除缓存的处理---** 每个App几乎都有清除缓存的功能** 一 手机上的磁盘缓存 == 从网络上下...
    Tuberose阅读 4,676评论 12 120
  • 《我的野蛮女友》— 命运 就是在你和你所爱的人之间牵一座桥。 《龙族IV·奥丁之渊》— 就像皇帝必承受皇冠之重,每...
    闻人罔阅读 153评论 0 0
  • 转眼娃三岁了。到了挑选幼儿园的节骨点。 孩子的结点真是多。前六个月是人生的关键期,一到三岁前是人生的关键期,三到六...
    海咸河淡阅读 500评论 0 0