前言
当使用SDWebImage下载图片的时候,会自动帮我们做一个缓存,用来下次使用的时候可以直接从缓存中取出,而不用再次下载,但是一般的应用程序都会有一个清除缓存的功能,有得时候是图片,有得时候是其他的东西,SDWebImage这么强大的框架当然也是有缓存清理的功能啦,但是我们如果想要清理其他的文件夹,也就是说并不局限于清除缓存这个功能,那么我们就可以自己制作一个清除文件的工具了。下面主要对SDWebImage清除图片缓存作延伸。
常见功能
文件夹大小计算
一般的,当我们清除缓存的时候,会告诉用户当前的缓存有多少,来让用户自己决定是否清除缓存,这个时候需要我们来计算缓存的大小,在SDWebImage中,有一个方法可以直接获取文件尺寸
NSInteger size = [[SDImageCache sharedImageCache] getSize];
获取之后,我们直接处理这个数字,将其转换为MB或者KB等就行了,是不是很简单,我们不用管图片存在哪里,也不管怎么获取,直接使用框架的方法即可,因为框架内部会为我们计算。
内部是怎么计算的呢?我们来看一下getSize这个方法
- (NSUInteger)getSize {
__block NSUInteger size = 0;
//同步计算
dispatch_sync(self.ioQueue, ^{
//拿到存储路径下的枚举,即所有缓存的图片文件
NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath];
//遍历图片文件
for (NSString *fileName in fileEnumerator) {
//拼接路径,得到图片的绝对路径
NSString *filePath = [self.diskCachePath stringByAppendingPathComponent:fileName];
//获得图片文件的属性
NSDictionary<NSString *, id> *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
//图片大小累加
size += [attrs fileSize];
}
});
return size;
}
通过观察SDWebImage的文件夹尺寸计算方法,我们可以延伸出文件夹的尺寸计算,在得到我们要计算的文件夹路径directoryPath之后
// 获取文件管理者
NSFileManager *mgr = [NSFileManager defaultManager];
// 获取文件夹下所有的子路径,包含子路径的子路径
NSArray *subPaths = [mgr subpathsAtPath:directoryPath];
NSInteger totalSize = 0;
//遍历子路径
for (NSString *subPath in subPaths) {
// 获取文件全路径
NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
// 判断隐藏文件
if ([filePath containsString:@".DS"]) continue;
// 判断是否文件夹
BOOL isDirectory;
// 判断文件是否存在,并且判断是否是文件夹
BOOL isExist = [mgr fileExistsAtPath:filePath isDirectory:&isDirectory];
if (!isExist || isDirectory) continue;
// 获取文件属性
NSDictionary *attr = [mgr attributesOfItemAtPath:filePath error:nil];
// 获取文件尺寸
NSInteger fileSize = [attr fileSize];
totalSize += fileSize;
}
文件清理
在SDWebImage中,缓存清理同样是一个方法
[[SDImageCache sharedImageCache] clearDiskOnCompletion:nil];
我们来看一下内部
- (void)clearDiskOnCompletion:(nullable SDWebImageNoParamsBlock)completion {
//异步执行
dispatch_async(self.ioQueue, ^{
//清除文件夹
[_fileManager removeItemAtPath:self.diskCachePath error:nil];
[_fileManager createDirectoryAtPath:self.diskCachePath
withIntermediateDirectories:YES
attributes:nil
error:NULL];
if (completion) {
//清除完成后的回调
dispatch_async(dispatch_get_main_queue(), ^{
completion();
});
}
});
}
同样的,我们对其进行延伸,清除一个文件夹内所有文件,在得到我们要清除的文件夹路径directoryPath之后
//获取文件管理者
NSFileManager *manager = [NSFileManager defaultManager];
// 获取cache文件夹下所有文件,不包括子路径的子路径
NSArray *subPaths = [manager contentsOfDirectoryAtPath:directoryPath error:nil];
for (NSString *subPath in subPaths) {
// 拼接完成全路径
NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
// 删除路径
[manager removeItemAtPath:filePath error:nil];
}
总结
因为可能以后会多次使用到这些功能,所以说,可以封装一个文件工具类,然后以后用的时候,直接导入使用即可。下面项目中有工具类的封装,可自行下载查看。
那么就先说到这里啦,有疑问和不足请务必要通知我!!!同时也欢迎大家关注和顶一下!嘿嘿嘿!
github地址:github
欢迎关注和star
欢迎来到我的博客,我是AnICoo1,我喂自己袋盐
有错误请评论指出或联系我,不胜感激!
个人邮箱:helloiamclh@gmail.com
转载请注明出处,毕竟写了这么多也不容易,谢谢!