-
Bg
1)由于項(xiàng)目需求需要,需要在設(shè)置頁(yè)面其中一個(gè)cell里面展示緩存大小哩照,并提供清除緩存功能挺物,發(fā)現(xiàn)之前自己一直使用的那個(gè)計(jì)算并清除緩存的方法并不完善,而且一直都有想要完善一下的想法飘弧,由此寫下這篇文章识藤,提供給有需要幫助的朋友參考
2)代碼的話就只提供一個(gè)簡(jiǎn)版的工具類了,使用很簡(jiǎn)單次伶,也簡(jiǎn)單說明下
-
先看下簡(jiǎn)單的效果圖
cache.gif -
簡(jiǎn)單介紹
現(xiàn)在這個(gè)功能已經(jīng)被抽成一個(gè)簡(jiǎn)單的工具類痴昧,既然是工具類,那么就先說明下如何使用
-
獲取文件夾大小
1)既然清除緩存就需要先計(jì)算緩存冠王,工具類里面提供了一個(gè)計(jì)算緩存大小的類方法赶撰,你只需要提供一個(gè)需要計(jì)算的文件夾路徑
/**
* @author li bo, 16/05/29
*
* 獲取path路徑文件夾的大小
*
* @param path 要獲取大小的文件夾全路徑
*
* @return 返回path路徑文件夾的大小
*/
+ (NSString *)getCacheSizeWithFilePath:(NSString *)path;
2)一般顯示緩存大小都是在cell上的label里面,這個(gè)label可以是使用系統(tǒng)的可以自己添加的,這里提供一個(gè)簡(jiǎn)單版的使用
在tableView的cellForRowAtIndexPath這個(gè)方法里面
if (indexPath.row==0) //如果是清除緩存對(duì)應(yīng)的這個(gè)cell
{
NSString *fileSize = [LBClearCacheTool getCacheSizeWithFilePath:filePath];
if ([fileSize integerValue] == 0)//如果沒有緩存豪娜,那么不需要顯示緩存大小
{
cell.textLabel.text = @"清除緩存";
}else //緩存大小不為0餐胀,顯示緩存大小
{
cell.textLabel.text = [NSString stringWithFormat:@"清除緩存(%@)",fileSize];
}
}
3)獲取文件夾大小部分代碼實(shí)現(xiàn)
//調(diào)試
#ifdef DEBUG
//如果文件夾不存在或者不是一個(gè)文件夾那么就拋出一個(gè)異常
//拋出異常會(huì)導(dǎo)致程序閃退,所以只在調(diào)試階段拋出瘤载,發(fā)布階段不要再拋了,不然極度影響用戶體驗(yàn)
BOOL isDirectory = NO;
BOOL isExist = [fileManager fileExistsAtPath:path isDirectory:&isDirectory];
if (!isExist || !isDirectory)
{
NSException *exception = [NSException exceptionWithName:@"fileError" reason:@"please check your filePath!" userInfo:nil];
[exception raise];
}
NSLog(@"debug");
//發(fā)布
#else
NSLog(@"post");
#endif
//以上判斷目的是忽略不需要計(jì)算的文件
if (!isExist || isDirectory || [filePath containsString:@".DS"]) continue;
//NSLog(@"%@",filePath);
//指定路徑骂澄,獲取這個(gè)路徑的屬性
//attributesOfItemAtPath:需要傳文件夾路徑
//但是attributesOfItemAtPath 只可以獲得文件屬性,不可以獲得文件夾屬性惕虑,這個(gè)也就是需要for-in遍歷文件夾里面每一個(gè)文件的原因
NSDictionary *dict= [fileManager attributesOfItemAtPath:filePath error:nil];
NSInteger size=[dict[@"NSFileSize"] integerValue];
totleSize+=size;
}
清除文件夾緩存
1)既然要清除坟冲,工具類里面也提供了一個(gè)清除文件夾緩存的類方法,需要辛苦你操作的依然是提供你需要清除緩存的文件夾全路徑
/**
* @author li bo, 16/05/29
*
* 清除path路徑文件夾的緩存
*
* @param path 要清除緩存的文件夾全路徑
*
* @return 是否清除成功
*/
+ (BOOL)clearCacheWithFilePath:(NSString *)path;
2)一般清除緩存都是在我們點(diǎn)擊了對(duì)應(yīng)這一行cell的時(shí)候才會(huì)去執(zhí)行的溃蔫,這里就在cell被點(diǎn)擊的方法里面執(zhí)行對(duì)應(yīng)的清除操作
在tableView的didSelectRowAtIndexPath方法中執(zhí)行
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0) {//如果是需要清除緩存對(duì)應(yīng)的cell
UIAlertController *alert=[UIAlertController alertControllerWithTitle:@"確定清除緩存嗎?" message:nil preferredStyle:UIAlertControllerStyleActionSheet];
//創(chuàng)建一個(gè)取消和一個(gè)確定按鈕
UIAlertAction *actionCancle=[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
//因?yàn)樾枰c(diǎn)擊確定按鈕后改變文字的值健提,所以需要在確定按鈕這個(gè)block里面進(jìn)行相應(yīng)的操作
UIAlertAction *actionOk=[UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
//清楚緩存
BOOL isSuccess = [LBClearCacheTool clearCacheWithFilePath:filePath];
if (isSuccess) //如果清除成功
{
//刷新指定行,讓cell更新緩存大小這個(gè)狀態(tài)
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
//來(lái)一個(gè)指示器伟叛,提示清除成功私痹,這樣用戶體驗(yàn)比較好
[SVProgressHUD setDefaultStyle:SVProgressHUDStyleDark];
[SVProgressHUD showSuccessWithStatus:@"清除成功"];
//彈框提示1秒后,把這個(gè)彈框消失统刮,默認(rèn)的消失時(shí)間有點(diǎn)長(zhǎng)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[SVProgressHUD dismiss];
});
}
}];
//將取消和確定按鈕添加進(jìn)彈框控制器
[alert addAction:actionCancle];
[alert addAction:actionOk];
//顯示彈框控制器
[self presentViewController:alert animated:YES completion:nil];
}
}
3)清除緩存功能部分代碼實(shí)現(xiàn)
/拿到path路徑的下一級(jí)目錄的子文件夾
NSArray *subpathArray = [fileManager contentsOfDirectoryAtPath:path error:nil];
//刪除子文件夾
[fileManager removeItemAtPath:filePath error:&error];
if (error) {
message = [NSString stringWithFormat:@"%@這個(gè)路徑的文件夾刪除失敗了紊遵,請(qǐng)檢查后重新再試",filePath];
return NO;
}else {
message = @"成功了";
}