网络图片
最近换了新的公司,已经两个月没有记录过东西了,惭愧惭愧。刚好今天在做清理缓存的功能,顺便记录一下:
通常APP中清理缓存主要分为两大类:
1.通过SDWebImage加载的图片文件缓存
2.通过NSFileManager计算缓存文件夹内的缓存并清理
SD的缓存清理网上有很多,所以今天我这里主要写下第二种方式;
直接贴出代码解释:
//清除缓存按钮的点击事件
//2018.08.02 注意这个路径下东西轻易不要删 所以不加入计算
//[self folderSizeAtPath:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject] +
CGFloat size = [self folderSizeAtPath:NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject] + [self folderSizeAtPath:NSTemporaryDirectory()];
NSString *message = size > 1 ? [NSString stringWithFormat:@"缓存%.2fM, 确定删除?", size] : [NSString stringWithFormat:@"缓存%.2fK, 确定删除?", size * 1024.0];
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:(UIAlertControllerStyleAlert)];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"确定" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {
//2018.08.02 注意清理的路径 否则可能造成自动登录设置也失效
[self cleanCaches:NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject];
[self.view makeToast:@"清除缓存成功!" duration:1.5 position:CSToastPositionCenter];
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleCancel) handler:nil];
[alert addAction:action];
[alert addAction:cancel];
dispatch_async(dispatch_get_main_queue(), ^{
[self showDetailViewController:alert sender:nil];
});
// 计算目录大小
- (CGFloat)folderSizeAtPath:(NSString *)path{
// 利用NSFileManager实现对文件的管理
NSFileManager *manager = [NSFileManager defaultManager];
CGFloat size = 0;
if ([manager fileExistsAtPath:path]) {
// 获取该目录下的文件,计算其大小
NSArray *childrenFile = [manager subpathsAtPath:path];
for (NSString *fileName in childrenFile) {
NSString *absolutePath = [path stringByAppendingPathComponent:fileName];
size += [manager attributesOfItemAtPath:absolutePath error:nil].fileSize;
}
// 将大小转化为M
return size / 1024.0 / 1024.0;
}
return 0;
}
// 根据路径删除文件
- (void)cleanCaches:(NSString *)path{
// 利用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];
}
}
}
这里重点讲下第一步计算size大小要注意的,可以看到这里:
CGFloat size = [self folderSizeAtPath:NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject] + [self folderSizeAtPath:NSTemporaryDirectory()];
其实是传递两个path路径去计算相应文件夹下的内容的大小,上面注释掉的部分其实只占用了很小的空间,但是存储的信息确非常关键,比如我们平时经常用到的NSUserDefaults中的数据 如果计算的时候加上这个路径。并且在调用清除方法
[self cleanCaches:"路径"];
也写入这个路径的话 NSUserDefaults中存储的信息也会丢失,例如我们平常可能保存的用户自动登录的信息扥扥,所以这里在计算缓存size和清理时要格外注意,可根据自己的需要进行调整。