幾乎每個(gè)應(yīng)用都有清除緩存的功能,一個(gè)應(yīng)用的使用難免會(huì)產(chǎn)生緩存赌髓,如文件緩存从藤、圖片緩存催跪,我們大部分應(yīng)用使用的SDWebImage就緩存了許多圖片,當(dāng)然它也提供的清除圖片緩存的功能夷野,這里我們介紹使用系統(tǒng)方法清除(肯定的懊蒸,SDWebImage清除緩存也是封裝的系統(tǒng)方法)為了提高應(yīng)用性能,用戶體驗(yàn)的友好悯搔,清除緩存勢(shì)在必得骑丸!
個(gè)人喜歡把一些實(shí)用方法封裝在工具類當(dāng)中,以便在下個(gè)項(xiàng)目中拖過去用就行妒貌,廢話不多說通危,直接上代碼,先在.h文件擬好類的方法名:
1.獲取某個(gè)文件緩存大小
+(long long)fileSizeWithPath:(NSString *)filePath;
2.獲取整個(gè)緩存大小
+ (NSString *)getAllCacheSize;
3.清除所有緩存,清除完成回調(diào)一個(gè)block
+ (void)removeCache:(void(^)())removeComplete;
.m文件代碼實(shí)現(xiàn):
//獲取單個(gè)文件方法特意提出來寫灌曙,方便以后可以有這種業(yè)務(wù)需求
+(long long)fileSizeWithPath:(NSString *)filePath{
NSFileManager *manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath :filePath]){
return [[manager attributesOfItemAtPath :filePath error : nil ] fileSize];
}
return 0 ;
}
獲取整個(gè)緩存文件大小菊碟,我這直接返回了NSSring
類型,因?yàn)榉奖阄易约喉?xiàng)目的使用在刺,當(dāng)然你可以仿造上面方法用long long
類型接收逆害。毋庸置疑,獲取整個(gè)緩存文件就是遍歷 所有的
單個(gè)文件緩存:
+ (NSString *)getAllCacheSize
{
//獲取緩存路徑
NSString *cachePath = [NSSearchPathForDirectoriesInDomains (NSCachesDirectory , NSUserDomainMask , YES) firstObject];
NSLog(@"路徑:%@",cachePath);
//創(chuàng)建文件管理對(duì)象
NSFileManager *filemanager = [NSFileManager defaultManager];
//判斷路徑不存在蚣驼,返回0.00M
if (![filemanager fileExistsAtPath :cachePath]) return @"0.00M" ;
NSEnumerator *childFilesEnumerator = [[filemanager subpathsAtPath :cachePath] objectEnumerator];
NSString *fileName;
long long sumSize = 0;
//遍歷所有子文件
while ((fileName = [childFilesEnumerator nextObject]) != nil ){
//拼接完整路徑
NSString * fileAbsolutePath = [cachePath stringByAppendingPathComponent :fileName];
//計(jì)算文件的大小
sumSize += [ self fileSizeWithPath :fileAbsolutePath];
}
float size_m = sumSize/(1024.00*1024.00);//注意:如果你要保持浮點(diǎn)型魄幕,1024必須帶小數(shù)點(diǎn),不然得到的是int類型颖杏;或者強(qiáng)制轉(zhuǎn)換(float)sumSize/(1024*1024)
return [NSString stringWithFormat:@"%.2fM",size_m];
}
異步清理緩存:
+ (void)removeCache:(void(^)())removeComplete
{
//異步
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//文件路徑
NSString *directoryPath=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSArray *subpaths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directoryPath error:nil];
//循環(huán)子路徑清除
for (NSString *subPath in subpaths) {
NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
[[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
}
//返回主線程
dispatch_async(dispatch_get_main_queue(), ^{
if (removeComplete) {
removeComplete();//可在此block做UI刷新操作纯陨,如果用了異步,UI操作必須返回主線程
}
});
});
}
到這里計(jì)算留储、清除的方法已經(jīng)OK了翼抠,一句代碼直接調(diào)用就行,是不是很簡單欲鹏,這里就不再啰嗦了机久。
額外:
由于筆者好奇,通過網(wǎng)上一大堆資料赔嚎,找出了其他不同的方法膘盖,代碼如下:
//獲取緩存方法
+ (NSString *)getAllCacheSize{
//定義變量存儲(chǔ)總的緩存大小
long long sumSize = 0;
//獲取當(dāng)前緩存路徑
NSString *cacheFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
NSLog(@"路徑:%@",cacheFilePath);
//創(chuàng)建文件管理對(duì)象
NSFileManager *filemanager = [NSFileManager defaultManager];
//獲取當(dāng)前緩存路徑下的所有子路徑
NSArray *subPaths = [filemanager subpathsOfDirectoryAtPath:cacheFilePath error:nil];
//遍歷所有子文件
for (NSString *subPath in subPaths) {
//1).拼接完整路徑
NSString *filePath = [cacheFilePath stringByAppendingFormat:@"/%@",subPath];
//2).計(jì)算文件的大小
long long fileSize = [[filemanager attributesOfItemAtPath:filePath error:nil]fileSize];
//3).加載到文件的大小
sumSize += fileSize;
}
float size_m = sumSize/(1024.00*1024.00);
return [NSString stringWithFormat:@"%.2fM",size_m];
}
//刪除緩存方法
+ (void)removeCache{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *cacheFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
[fileManager removeItemAtPath:cacheFilePath error:nil];
}
通過筆者測(cè)試,該方法獲取的緩存大小少于第一種方法尤误,刪除也是刪除相應(yīng)方法獲取的緩存侠畔。該方法應(yīng)該只是獲取Caches
里面的圖片緩存,并沒有計(jì)算其他文件的緩存损晤;如有大神清楚软棺,請(qǐng)不吝賜教!小生萬分感謝尤勋!
轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/94ae5c038ed7