您现在的位置是:首页 >学无止境 >Swift 技术 删除缓存,清空缓存网站首页学无止境

Swift 技术 删除缓存,清空缓存

冯汉栩 2023-07-21 12:00:03
简介Swift 技术 删除缓存,清空缓存

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

前言

app在使用过程中的缓存会越来越大的很正常的,清除它,网上也有很多办法,下面就直接上代码.

正题

1.获取app的缓存大小.

一般来说,获取app的缓存大小都是获取沙盒里面cache缓存文件的大小.

在这里插入图片描述

OC - Cache文件

// 获取缓存
-(long long)getCachesWithFile:(NSString *)file {
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:file];
    // 利用NSFileManager实现对文件的管理
    NSFileManager *fileManager = [NSFileManager defaultManager];
    long long totalSize = 0 ;
    if ([fileManager fileExistsAtPath:path]) {
        // 获取该路径下面的文件名
        NSArray *childrenFiles = [fileManager subpathsAtPath:path];
        for (NSString *fileName in childrenFiles) {
            // 拼接路径
            NSString *absolutePath = [path stringByAppendingPathComponent:fileName];
            //获取文件属性 attributesOfItemAtPath 只能回去文件尺寸,获取文件夹不对
            NSDictionary *attr = [fileManager attributesOfItemAtPath:absolutePath error:nil];
            // default尺寸
            NSInteger fileSize = [attr fileSize];
            totalSize += fileSize;
        }        
    }
    return totalSize;
}

使用

long long totalSize =  [self getCachesWithFile:@"Library/Caches"];
 NSLog(@"totalSize: %lld",totalSize);//totalSize: 1801923

Swift - Cache文件

///获取APP缓存
func getCacheSize()-> String {
    // 取出cache文件夹目录
    let cachePath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first

    // 取出文件夹下所有文件数组
    let fileArr = FileManager.default.subpaths(atPath: cachePath!)

    //快速枚举出所有文件名 计算文件大小
    var size = 0
    for file in fileArr! {

        // 把文件名拼接到路径中
        let path = cachePath! + ("/(file)")
        // 取出文件属性
        let floder = try! FileManager.default.attributesOfItem(atPath: path)
        // 用元组取出文件大小属性
        for (key, fileSize) in floder {
            // 累加文件大小
            if key == FileAttributeKey.size {
                size += (fileSize as AnyObject).integerValue
            }
        }
    }

    let totalCache = Double(size) / 1024.00 / 1024.00
    return String(format: "%.2f", totalCache)
}

使用

print("size: (getCacheSize())")   // size: 1.72

2.删除app的缓存

OC - Cache文件

// 删除缓存
- (void)cleanCachesWithFile:(NSString *)file {
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:file];
    // 利用NSFileManager实现对文件的管理
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:path]) {
    // 获取该路径下面的文件名
    NSArray *childrenFiles = [fileManager subpathsAtPath:path];
            for (NSString *fileName in childrenFiles) {
            // 拼接路径
            NSString *absolutePath = [path stringByAppendingPathComponent:fileName];
            // 将文件删除
            [fileManager removeItemAtPath:absolutePath error:nil];
        }
    }
}

使用

[self cleanCachesWithFile:@"Library/Caches"];

Swift - Cache文件

///删除APP缓存
func clearCache() {
	// 取出cache文件夹目录
	let cachePath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first
    let fileArr = FileManager.default.subpaths(atPath: cachePath!)
    // 遍历删除
    for file in fileArr! {
        let path = (cachePath! as NSString).appending("/(file)")
        if FileManager.default.fileExists(atPath: path) {
            do {
                try FileManager.default.removeItem(atPath: path)
            } catch {
            }
        }
    }
    self.getCacheSize()
}

使用

clearCache()

需求

1.删除音乐app的缓存

说明一下:cache文件一般用户存储使用app过程中的缓存文件,还有就是kingfish下载下来的缓存图片,但是音乐app在听音乐的时候,产生的听过歌的缓存保存在tmp文件里面的.

另外下载音乐的时候,在下载过程中,音乐下载中的缓存文件是放在tmp文件里面,等待下载完成之后才会移动到Documents这个时候如果没有删除tmp的歌曲就会产生缓存,就会越来越大

下面图片是tmp文件听歌时产生的缓存文件

在这里插入图片描述
所以开发音乐app的时候,如果只删除caches文件里面的缓存的话,是不行的,app的真实缓存只会越来越大.
其实我们可以从设置里面看得出来的.
在这里插入图片描述
说了这么久,我们只需要删除缓存的时候吧tmp文件删除就好了,直接上代码.

    func clearFileCache() -> String {
        let filePath: String = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first ?? ""
        if let files = FileManager.default.subpaths(atPath: filePath+"/com.naxos.nml") {
            for path in files {
                let temPath: String = filePath+"/com.naxos.nml"+"/"+path
                if FileManager.default.fileExists(atPath: temPath) {
                    try? FileManager.default.removeItem(atPath: temPath)
                }
            }
        }
        
        if let files = FileManager.default.subpaths(atPath: filePath+"/com.onevcat.Kingfisher.ImageCache.default") {
            for path in files {
                let temPath: String = filePath+"/com.onevcat.Kingfisher.ImageCache.default"+"/"+path
                if FileManager.default.fileExists(atPath: temPath) {
                    try? FileManager.default.removeItem(atPath: temPath)
                }
            }
        }
        
        let tmpPath = NSHomeDirectory() + "/tmp"
        if let files = FileManager.default.subpaths(atPath: tmpPath) {//这个路径所含有的文件
            for path in files {//遍历数组中的每一个文件
                let tmpRecourePath: String = tmpPath + "/" + path
                if FileManager.default.fileExists(atPath: tmpRecourePath) {
                    try? FileManager.default.removeItem(atPath: tmpRecourePath)
                }
            }
        }
        
        return "0B"
        //return getCacheFileSize()
    }

删除tmp文件之后文稿与数据就会变少,不过我看过,文稿与数据的内存大小的变化不是马上的,什么时候更新内容有待研究.有时候隔了一个晚上再打开缓存大小才会发生变化

2.删除缓存后没有即时更新的问题.

在这里插入图片描述

我发现一个问题,当我们点击删除缓存的时候,直接吧caches的全部文件删除掉,然后使用app,在进来该页面没有产生新的缓存,打开沙盒也发现没有,然后在重新启动app使用,才会产生新的缓存.

经过测试发现,删除缓存的时候,如果直接把文件caches里面的文件夹也删除掉的话,继续使用过程中,不会重新创建文件夹,缓存就无法保存到对应的文件夹里面,所以我上面删除缓存的方法是精确到删除caches里面的某个文件夹里面的文件进行删除的.这样子的话,删除完出去再次使用app就会继续正常产生新的缓存.

在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。