iOS 缓存的清除及优化

本文详细介绍了如何在iOS应用中正确地计算并清除缓存,包括使用SDWebImage的图片缓存和自定义文件夹的内容。强调了计算缓存大小和清除过程应避免阻塞主线程,确保用户体验流畅。同时提出了根据缓存大小决定是否清除以及在清除过程中显示进度动画的优化策略。
摘要由CSDN通过智能技术生成

缓存默认存储在cache中,APPStore中有一条明确规定,你的APP中缓存文件只能保存在沙盒路径下Caches文件夹或Temp文件夹下,不然将会被拒。而Temp文件夹下内容将会在APP退出时自动清除,所以我们清除APP缓存主要是清除Caches文件夹下的内容。而缓存文件包括两部分,一部分是使用SDWebImage缓存的内容,其次可能存在自定义的文件夹中的内容(视频,音频等内容),所以计算要分两部分。

清除缓存一般做法是:1、计算缓存文件的大小;2、显示大小;3、弹框询问是否清除。

1、计算缓存量(简单粗暴的计算法)

把缓存量显示出来

 

self.CacheLabel.text = [NSString stringWithFormat:@"%.2fM", [self  getCacheSize]];

清除缓存的方法(直接调用,同样简单粗暴):

//异步清除图片缓存 (磁盘中的)
[[SDImageCache sharedImageCache] clearDisk];
[[NSFileManager defaultManager] removeItemAtPath:[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES)lastObject]error:nil];

至此清除缓存功能是不是已经完成。如果不考虑性能问题那就已经完成了。而下面这两个方法:

 unsigned long long size = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"CustomFile"].fileSize;
size += [SDImageCache sharedImageCache].getSize; 

/上述两个方法都是在主线程中完成的,如果缓存文件非常大的话,计算时间会比较长,会导致应用卡死,因此需要将上述代码放到子线程中完成。/

正确的清除姿势

 

注意点:

1、SDWebImage清除缓存是在子线程中进行的,清除自定义文件内容应该也放在子线程中(删除大文件可能比较耗时),为了保证两者不冲突,可以将删除自定义文件内容放在SDWebImage缓存清除完毕之后进行,然后再回到主线程操作。
2、在计算文件大小过程中不允许点击清除按钮的
3、缓存文件可能比较大,清除缓慢,可以给你清除动画(比如放一个菊花转圈圈)。

更加人性化的是根据其大小再判断是否清除缓存。

1、根据其大小再判断是否清除缓存。
/**
* 根据传过来的路径计算文件夹里内容或文件的大小
*
* @param filePath 文件夹或文件的路径
*
* @return 大小
*/
- (NSUInteger)calculateFileSize:(NSString *)filePath
{
NSFileManager *fileManager = [NSFileManager defaultManager];

    //是否为文件
    BOOL isFile = NO;
    
    //判断文件或文件夹是否存在(也就是判断filePath是否是一个正确的路径)
    BOOL isExist = [fileManager fileExistsAtPath:filePath isDirectory:&isFile];
    
    if(!isExist) return 0;//不存在返回0
    
    if(!isFile)//是文件
    {
        return [[fileManager attributesOfItemAtPath:filePath error:nil][NSFileSize] integerValue];
    }
    else //是文件夹
    {
        //遍历文件夹中的所有内容
        NSArray *subPaths = [fileManager subpathsAtPath:filePath];
        NSUInteger totalBytes = 0;
        for(NSString *subPath in subPaths)
        {
            //NSLog(@"文件夹下的全部内容的路径:%@", subPath);
            //获取全路径
            NSString *fullPath = [filePath stringByAppendingString:[NSString stringWithFormat:@"/%@", subPath]];
            BOOL dir= NO;
            [fileManager fileExistsAtPath:fullPath isDirectory:&dir];
            
            if(!dir)//是文件就计算大小,注意文件夹是没有大小的所以就不用计算了
            {
                totalBytes += [[fileManager attributesOfItemAtPath:fullPath error:nil][NSFileSize] integerValue];
            }
        }
        return totalBytes/1024.0/1024.0;
    }
}

2、根据路径删除文件或文件夹

[[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值