iOS-清除緩存功能(封裝)

應(yīng)用場(chǎng)景:

現(xiàn)在眾多app中都會(huì)有清楚緩存的功能,怎么能精確的計(jì)算緩存文件的大小,從而清除緩存文件呢,下面對(duì)清楚功能做了個(gè)封裝,以后需要實(shí)現(xiàn)此功能的小伙伴,可以直接拿過(guò)去用了哦,非常方便的.

設(shè)計(jì)思路: 可以根據(jù)SDWebImage框架的思路, 獲取文件夾路徑--->遍歷所有文件,一個(gè)個(gè)加起來(lái)--->獲取文件夾下的子路徑--->利用文件管理者計(jì)算所有文件尺寸
首先我們可封裝一個(gè)工具類,這樣我們用到此功能的時(shí)候就可以直接拿出來(lái)用
  • 首先在.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;
  • 作為一名資深的程序員封裝的話,別人使用錯(cuò)誤使用的話,我們應(yīng)該提供一些錯(cuò)誤信息,也就是所謂的拋出異常(在文件.m中實(shí)現(xiàn)方法)
    說(shuō)明:為了避免計(jì)算比較大的文件時(shí),計(jì)算時(shí)間會(huì)很久,如果執(zhí)行app跳轉(zhuǎn)的話,會(huì)產(chǎn)生卡頓的現(xiàn)象,所以采用了block回調(diào)的方式
#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:報(bào)錯(cuò)原因
        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];
    }

}

// 計(jì)算緩存
+ (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:報(bào)錯(cuò)原因
       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:只能獲取文件尺寸,獲取文件夾不對(duì),
            NSDictionary *attr = [mgr attributesOfItemAtPath:filePath error:nil];
            
            // 獲取文件尺寸
            NSInteger fileSize = [attr fileSize];
            
            totalSize += fileSize;
        }
        
        // 計(jì)算完成回調(diào)(為了避免計(jì)算大的文件夾,比較耗時(shí),如果直接返回結(jié)果,控制器跳轉(zhuǎn)的時(shí)候回產(chǎn)生卡頓,所以采用block回調(diào)的方式)
        dispatch_sync(dispatch_get_main_queue(), ^{
            if (completion) {
                completion(totalSize);
            }
        });
        
    });
    
}
下面我們開始演示下怎么利用這個(gè)工具類
  • 在控制器的.m文件中(首先定義個(gè)宏,可以拿到Caches文件路徑,然后設(shè)置個(gè)totalSize屬性,來(lái)強(qiáng)引用這個(gè)尺寸的大小,后面會(huì)用到):
#import "FileTool.h"
@property (nonatomic, assign) NSInteger totalSize;
#define CachePath [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]
  • 在viewDidLoad方法中調(diào)用計(jì)算文件大小的方法
- (void)viewDidLoad {
    [super viewDidLoad];
    
    [SVProgressHUD showWithStatus:@"正在計(jì)算緩存尺寸...."];
    
    // 獲取文件夾尺寸
    // 文件夾非常小,如果我的文件非常大
    [FileTool getFileSize:CachePath completion:^(NSInteger totalSize) {
        
        _totalSize = totalSize;
        
        [self.tableView reloadData];
        
        [SVProgressHUD dismiss];
    }];
}
  • 寫一個(gè)處理尺寸大小的方法
// 獲取緩存尺寸字符串
- (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;
}
  • 在點(diǎn)擊事件中處理,刪除緩存功能
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 清空緩存
    // 刪除文件夾里面所有文件
    [FileTool removeDirectoryPath:CachePath];
    // 刪除緩存之后,文件大小顯示為0
    _totalSize = 0;
    [self.tableView reloadData];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末反璃,一起剝皮案震驚了整個(gè)濱河市涌韩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖翅溺,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吨拍,死亡現(xiàn)場(chǎng)離奇詭異伊滋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)筒主,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門藤韵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)欲险,“玉大人盯荤,你說(shuō)我怎么就攤上這事秋秤。” “怎么了鞋真?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵檩互,是天一觀的道長(zhǎng)闸昨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)循诉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上芭毙,老公的妹妹穿的比我還像新娘。我一直安慰自己侈百,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布迷捧。 她就那樣靜靜地躺著笙蒙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肥荔,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天燕耿,我揣著相機(jī)與錄音淀散,去河邊找鬼蚜锨。 笑死亚再,一個(gè)胖子當(dāng)著我的面吹牛氛悬,可吹牛的內(nèi)容都是我干的耘柱。 我是一名探鬼主播棍现,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼士袄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼戈稿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起肋乍,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤墓造,失蹤者是張志新(化名)和其女友劉穎涮俄,沒想到半個(gè)月后孕锄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苞尝,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年餐抢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了强重。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片志鹃。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖韧骗,靈堂內(nèi)的尸體忽然破棺而出淋样,到底是詐尸還是另有隱情趁猴,我是刑警寧澤枫慷,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布探孝,位于F島的核電站,受9級(jí)特大地震影響誉裆,放射性物質(zhì)發(fā)生泄漏顿颅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一足丢、第九天 我趴在偏房一處隱蔽的房頂上張望粱腻。 院中可真熱鬧,春花似錦斩跌、人聲如沸绍些。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柬批。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氮帐,已是汗流浹背嗅虏。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留上沐,地道東北人皮服。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像奄容,于是被迫代替她去往敵國(guó)和親冰更。 傳聞我的和親對(duì)象是個(gè)殘疾皇子产徊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,737評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)昂勒、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,059評(píng)論 4 62
  • 周末的晚上舟铜,冷金海正在電腦上看某個(gè)音樂(lè)綜藝節(jié)目戈盈,正進(jìn)入1V1 PK賽投票環(huán)節(jié),手機(jī)卻叮叮咚咚響個(gè)沒完谆刨。他皺起眉頭塘娶,...
    左語(yǔ)三千閱讀 759評(píng)論 1 0
  • 就這樣與村上的【跑步】相遇了,比我預(yù)期的要早一些痊夭。好奇這么書到底在講什么刁岸,便花了15分鐘的時(shí)間匆匆看了第一章節(jié)。說(shuō)...
    小小碼農(nóng)養(yǎng)成中閱讀 1,360評(píng)論 0 0