iOS-清除缓存功能(封装)
2016-06-03 本文已影响542人
Mr_Bob_
应用场景:
现在众多app中都会有清楚缓存的功能,怎么能精确的计算缓存文件的大小,从而清除缓存文件呢,下面对清楚功能做了个封装,以后需要实现此功能的小伙伴,可以直接拿过去用了哦,非常方便的.
设计思路: 可以根据SDWebImage
框架的思路, 获取文件夹路径
--->遍历所有文件,一个个加起来
--->获取文件夹下的子路径
--->利用文件管理者计算所有文件尺寸
首先我们可封装一个工具类,这样我们用到此功能的时候就可以直接拿出来用
- 首先在.h文件中声明我们封装的方法名:
#import <Foundation/Foundation.h>
@interface FileTool : NSObject
/**
* 获取文件夹尺寸
*
* @param directoryPath 文件夹路径
*
* @return 返回文件夹尺寸
*/
+ (void)getFileSize:(NSString *)directoryPath completion:(void(^)(NSInteger))completion;
/**
* 删除文件夹所有文件
*
* @param directoryPath 文件夹路径
*/
+ (void)removeDirectoryPath:(NSString *)directoryPath;
- 作为一名资深的程序员封装的话,别人使用错误使用的话,我们应该提供一些错误信息,也就是所谓的抛出异常(在文件.m中实现方法)
说明:为了避免计算比较大的文件时,计算时间会很久,如果执行app跳转的话,会产生卡顿的现象,所以采用了block回调的方式
#import "FileTool.h"
@implementation FileTool
+ (void)removeDirectoryPath:(NSString *)directoryPath
{
// 获取文件管理者
NSFileManager *mgr = [NSFileManager defaultManager];
BOOL isDirectory;
BOOL isExist = [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory];
if (!isExist || !isDirectory) {
// 抛异常
// name:异常名称
// reason:报错原因
NSException *excp = [NSException exceptionWithName:@"pathError" reason:@"笨蛋 需要传入的是文件夹路径,并且路径要存在" userInfo:nil];
[excp raise];
}
// 获取cache文件夹下所有文件,不包括子路径的子路径
NSArray *subPaths = [mgr contentsOfDirectoryAtPath:directoryPath error:nil];
for (NSString *subPath in subPaths) {
// 拼接完成全路径
NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
// 删除路径
[mgr removeItemAtPath:filePath error:nil];
}
}
// 计算缓存
+ (void)getFileSize:(NSString *)directoryPath completion:(void(^)(NSInteger))completion
{
// 获取文件管理者
NSFileManager *mgr = [NSFileManager defaultManager];
BOOL isDirectory;
BOOL isExist = [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory];
if (!isExist || !isDirectory) {
// 抛异常
// name:异常名称
// reason:报错原因
NSException *excp = [NSException exceptionWithName:@"pathError" reason:@"笨蛋 需要传入的是文件夹路径,并且路径要存在" userInfo:nil];
[excp raise];
}
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 获取文件夹下所有的子路径,包含子路径的子路径
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;
// 获取文件属性
// attributesOfItemAtPath:只能获取文件尺寸,获取文件夹不对,
NSDictionary *attr = [mgr attributesOfItemAtPath:filePath error:nil];
// 获取文件尺寸
NSInteger fileSize = [attr fileSize];
totalSize += fileSize;
}
// 计算完成回调(为了避免计算大的文件夹,比较耗时,如果直接返回结果,控制器跳转的时候回产生卡顿,所以采用block回调的方式)
dispatch_sync(dispatch_get_main_queue(), ^{
if (completion) {
completion(totalSize);
}
});
});
}
下面我们开始演示下怎么利用这个工具类
- 在控制器的.m文件中(首先定义个宏,可以拿到Caches文件路径,然后设置个totalSize属性,来强引用这个尺寸的大小,后面会用到):
#import "FileTool.h"
@property (nonatomic, assign) NSInteger totalSize;
#define CachePath [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]
- 在viewDidLoad方法中调用计算文件大小的方法
- (void)viewDidLoad {
[super viewDidLoad];
[SVProgressHUD showWithStatus:@"正在计算缓存尺寸...."];
// 获取文件夹尺寸
// 文件夹非常小,如果我的文件非常大
[FileTool getFileSize:CachePath completion:^(NSInteger totalSize) {
_totalSize = totalSize;
[self.tableView reloadData];
[SVProgressHUD dismiss];
}];
}
- 写一个处理尺寸大小的方法
// 获取缓存尺寸字符串
- (NSString *)sizeStr
{
NSInteger totalSize = _totalSize;
NSString *sizeStr = @"清除缓存";
// MB KB B
if (totalSize > 1000 * 1000) {
// MB
CGFloat sizeF = totalSize / 1000.0 / 1000.0;
sizeStr = [NSString stringWithFormat:@"%@(%.1fMB)",sizeStr,sizeF];
} else if (totalSize > 1000) {
// KB
CGFloat sizeF = totalSize / 1000.0;
sizeStr = [NSString stringWithFormat:@"%@(%.1fKB)",sizeStr,sizeF];
} else if (totalSize > 0) {
// B
sizeStr = [NSString stringWithFormat:@"%@(%.ldB)",sizeStr,totalSize];
}
return sizeStr;
}
- 在显示缓存大小的地方显示尺寸
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
// 获取缓存尺寸字符串
cell.textLabel.text = [self sizeStr];
return cell;
}
- 在点击事件中处理,删除缓存功能
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// 清空缓存
// 删除文件夹里面所有文件
[FileTool removeDirectoryPath:CachePath];
// 删除缓存之后,文件大小显示为0
_totalSize = 0;
[self.tableView reloadData];
}