iOS開發(fā)_緩存處理

前言:最近在做一個練手小項目统翩,由于項目中用到了如SDWebImage這類有緩存處理的框架娇豫,程序運行過程中會產(chǎn)生一些緩存锣杂,而我們知道很多app內(nèi)都有獲取緩存大小和清除緩存功能脂倦,于是我也動手做了一下。

Snip20170925_1.png

緩存存在原因:

在程序運行過程中元莫,我們可能需要多次請求同一個鏈接來獲取數(shù)據(jù)赖阻,比如微博,微信朋友圈功能踱蠢,但如果每次都發(fā)送一條新的請求來獲取數(shù)據(jù)話會造成以下問題:

(1) 用戶流量的浪費

(2) 程序響應(yīng)速度不夠快,用戶體驗差

為了解決上面的問題火欧,一般考慮對數(shù)據(jù)進行緩存.App需要緩存的主要原因就是改善應(yīng)用所表現(xiàn)出的性能。將應(yīng)用內(nèi)容緩存起來可以支持離線茎截、節(jié)省用戶流量苇侵、減少加載時間等。緩存機制一般有兩種企锌。第一種是“按需緩存”榆浓,這種情況下應(yīng)用緩存起請求應(yīng)答,就和Web瀏覽器的工作原理一樣撕攒;第二種是“預(yù)緩存”陡鹃,這種情況是緩存全部內(nèi)容(或者最近n條記錄)以便離線訪問。

如何獲取一個應(yīng)用下的緩存數(shù)據(jù)以及計算緩存大写蛉础:

我們知道一個app下會有個cache文件夾杉适,專門來保存緩存文件,我們想要獲取文件緩存柳击,只需要獲取cache文件夾路徑猿推,然后遍歷文件夾路徑下的所有文件(不包括文件本身,因為文件夾也是有大小的捌肴,獲取文件夾本身的話會使獲取的緩存大于真實緩存)并計算文件大小蹬叭,即可算得緩存大小。這部分在很多框架中都會用到,比如SDWebImage中獲取文件夾大小內(nèi)容的代碼實現(xiàn)如下:

#pragma mark - Cache Info

- (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;
}

因此我們參考這個代碼状知,將目標目錄替換成cache文件夾,由于緩存可能很大秽五,讀取文件是個耗時操作,所以我們開啟子線程處理獲取緩存大小操作饥悴,當執(zhí)行完成坦喘,用block將結(jié)果返回出去,代碼實現(xiàn)如下:

+ (void)getFileSize:(NSString *)cachePath completion:(void (^)(NSInteger))completion {
    
    // 1.創(chuàng)建文件管理者對象
    NSFileManager *mgr = [NSFileManager defaultManager];
    
    // 異常處理
    BOOL isDirectory;
    [mgr fileExistsAtPath:cachePath isDirectory:&isDirectory];
    if (!isDirectory) {
        NSException *exp = [NSException exceptionWithName:@"invalid cache directory" reason:@"笨蛋盲再,要傳入一個文件路徑" userInfo:nil];
        [exp raise];
    }
    
    // 2.獲取緩存目錄下的所有文件
    NSArray *pathArr = [mgr subpathsAtPath:cachePath];
    
    
    
    // 開啟子線程處理耗時操作
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSInteger totalSize = 0;// 統(tǒng)計文件總大小
        // 3.遍歷文件目錄下的所有文件
        for (NSString *path in pathArr) {
            
            // 4.拼接文件真實路徑
            NSString *filePath = [cachePath stringByAppendingPathComponent:path];
            
            // 5.判斷是否為文件夾
            BOOL isExist;
            BOOL isDirectory;
            isExist = [mgr fileExistsAtPath:filePath isDirectory:&isDirectory];
            if (!isExist || isDirectory) continue;
            
            // 6.獲取文件大小
            NSDictionary *attrs = [mgr attributesOfItemAtPath:filePath error:nil];
            totalSize += [attrs fileSize];

            
            // 將獲取到的文件傳遞出去
            dispatch_sync(dispatch_get_main_queue(), ^{
                if (completion) {
                    completion(totalSize);
                }
            });
            
        }
    });
}

如何清除緩存

與獲取緩存的思路相同,遍歷所有文件瓣铣,然后刪除文件答朋,代碼簡單易懂。話不多說棠笑,直接上代碼:

+ (void)removeDirectory:(NSString *)filePath {
    
    // 1.創(chuàng)建文件管理者對象
    NSFileManager *mgr = [NSFileManager defaultManager];
    
    // 異常處理
    BOOL isDirectory;
    BOOL isExist;
    isExist = [mgr fileExistsAtPath:filePath isDirectory:&isDirectory];
    if (!isDirectory || !isExist) {
        NSException *exp = [NSException exceptionWithName:@"invalid cache directory" reason:@"笨蛋梦碗,要傳入一個文件路徑,并且文件路徑要存在!" userInfo:nil];
        [exp raise];
    }
    
    // 2.獲取緩存目錄下的所有文件夾
    NSArray *pathArr = [mgr contentsOfDirectoryAtPath:filePath error:nil];
    
    // 3.遍歷文件目錄下的所有文件
    for (NSString *path in pathArr) {
        
        // 4.拼接文件真實路徑
        NSString *realPath = [filePath stringByAppendingPathComponent:path];
        
        // 5.刪除文件
        [mgr removeItemAtPath:realPath error:nil];
        
    }
}

PS:最后如果各位大佬發(fā)現(xiàn)那里有問題歡迎批評指出蓖救,覺得有用點個喜歡~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洪规,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子循捺,更是在濱河造成了極大的恐慌斩例,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巨柒,死亡現(xiàn)場離奇詭異樱拴,居然都是意外死亡,警方通過查閱死者的電腦和手機洋满,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門晶乔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牺勾,你說我怎么就攤上這事正罢。” “怎么了驻民?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵翻具,是天一觀的道長。 經(jīng)常有香客問我回还,道長裆泳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任柠硕,我火速辦了婚禮工禾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蝗柔。我一直安慰自己闻葵,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布癣丧。 她就那樣靜靜地躺著槽畔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胁编。 梳的紋絲不亂的頭發(fā)上厢钧,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天鳞尔,我揣著相機與錄音,去河邊找鬼坏快。 笑死铅檩,一個胖子當著我的面吹牛憎夷,可吹牛的內(nèi)容都是我干的莽鸿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拾给,長吁一口氣:“原來是場噩夢啊……” “哼祥得!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒋得,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤级及,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后额衙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饮焦,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年窍侧,在試婚紗的時候發(fā)現(xiàn)自己被綠了县踢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡伟件,死狀恐怖硼啤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斧账,我是刑警寧澤谴返,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站咧织,受9級特大地震影響嗓袱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜习绢,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一渠抹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毯炮,春花似錦逼肯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至为迈,卻和暖如春三椿,著一層夾襖步出監(jiān)牢的瞬間缺菌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工搜锰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留白魂,地道東北人送膳。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親径玖。 傳聞我的和親對象是個殘疾皇子榕茧,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理奴紧,服務(wù)發(fā)現(xiàn)涯鲁,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,110評論 25 707
  • 轉(zhuǎn)載:H5緩存機制淺析-移動端Web加載性能優(yōu)化【干貨】 作者:賀輝超歌馍,騰訊游戲平臺與社區(qū)產(chǎn)品部 高級工程師 目錄...
    meng_philip123閱讀 11,514評論 6 48
  • 幸福 五一前夕握巢,臨夏州第十屆旅游宣傳月活動暨臨夏市第二屆河州牡丹文化節(jié)開幕的當天下午,旅行社和媒體旅游踩線行程安排...
    有點個性閱讀 456評論 0 0
  • 海邊松却,傍晚暴浦,昏黃的燈光拉出長長的身影。逐漸退卻的潮水一層接一層晓锻,拼命地向岸邊努力著歌焦。嘩……嘩……頑強地擠壓在一起,...
    老貓solo閱讀 478評論 6 11