一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。
前言
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就会继续正常产生新的缓存.