緩存相關(guān)

1.使用第三方框架sdWebImage 下載的圖片,要計(jì)算出他的大小,使用

#import <SDImageCache.h>
NSUInteger cacheSize = [[SDImageCache sharedImageCache]getSize];

獲取文件夾緩存原理:
1.獲取文件夾路徑
2.遍歷子文件,拼接全文件名
3.通過(guò)文件管理類獲取文件信息 dict.fileSize

-(unsigned long long)getFileSize:(NSString *)directoryPath
{
    //1.獲取緩存文件夾
    NSString * cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    //2.拼接文件夾路徑
    NSString * filePath = [cachePath stringByAppendingPathComponent:directoryPath];
    //3.判斷是否文件夾 是 遍歷子文件夾,算出文件總大小; 否 算出當(dāng)前文件夾
    NSFileManager * mgr = [NSFileManager defaultManager];
    unsigned long long cacheSize = 0;
    BOOL isDirectory = NO;
    BOOL isExist=  [mgr fileExistsAtPath:filePath isDirectory:&isDirectory];
if ( ! isExist)
    {
        NSException * exception = [NSException exceptionWithName:@"非法路徑" reason:@"路徑不存在" userInfo:nil];
        [exception raise];
    }
    if (isDirectory) {
        NSDirectoryEnumerator * enumerator = [mgr enumeratorAtPath:filePath];
        for (NSString * subPath in enumerator) {
            NSString * fullPath = [filePath stringByAppendingPathComponent:subPath];
            NSDictionary * dict = [mgr attributesOfItemAtPath:fullPath error:nil];
            cacheSize += dict.fileSize;
        }
    }
    else {
        cacheSize = [mgr attributesOfItemAtPath:filePath error:nil].fileSize;
    }
    return cacheSize;
}

處理不同cell共存,將清除緩存的cell抽成自定義cell

static NSString * const LMClearCellID = @"LMClearCellID";
@implementation LMSettingController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.tableView registerClass:[LMClearCell class]forCellReuseIdentifier:LMClearCellID];
    
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    return [tableView dequeueReusableCellWithIdentifier:LMClearCellID];
}

換算單位

-(NSString *) cacheStr
{
    if (_cacheStr == nil) {
        
        if (_cacheSize > pow(10, 9)) {
            
            _cacheStr = [NSString stringWithFormat:@"清除緩存(%.2fGB)",_cacheSize / pow(10, 9)];
        }
        else if (_cacheSize > pow(10, 6)){
            _cacheStr = [NSString stringWithFormat:@"清除緩存(%.2fMB)",_cacheSize / pow(10, 6)];
        }
        else if (_cacheSize > pow(10, 3)){
            _cacheStr = [NSString stringWithFormat:@"清除緩存(%.2fKB)",_cacheSize / pow(10, 3)];
        }
        else
        {
            _cacheStr = [NSString stringWithFormat:@"清除緩存(%zdB)",_cacheSize];
        }
    }
    return _cacheStr;
}

開啟子線程計(jì)算大小

-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        self.textLabel.text = @"正在計(jì)算大小...";
        self.userInteractionEnabled = NO;
          __weak typeof (self)  weakSelf = self;
        
        //開啟子線程計(jì)算大小
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            sleep(5);
             NSString * cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
            NSString * filePath = [cachePath stringByAppendingPathComponent:@"default"];
            weakSelf.cacheSize = [LMFileCacheManger getFileSize:filePath];
            if (weakSelf == nil) return ;
          dispatch_async(dispatch_get_main_queue(), ^{
              weakSelf.textLabel.text = weakSelf.cacheStr;
              weakSelf.userInteractionEnabled = YES;
          });
            
        });
    }
    return  self;
}

點(diǎn)擊cell刪除緩存
1.先刪除SDWebImage的緩存,再刪除自己的緩存
2.根據(jù)需要重新創(chuàng)建自己的文件夾

(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
    if ([cell isKindOfClass:[LMClearCell class]]) {
        LMClearCell * clearCell = (LMClearCell *)cell;
        [clearCell clearCache];
    }
}
---
-(void)clearCache
{
    //先刪除SDWebImage的緩存
    [[SDImageCache sharedImageCache] clearDiskOnCompletion:^{
        NSString * path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
        NSLog(@"%@",path);
        NSString* fullpath = [path stringByAppendingPathComponent:@"custom"];
        
        [LMFileCacheManger clearFileCache:fullpath]; //刪除自己的文件夾
        dispatch_async(dispatch_get_main_queue(),^{//回到主線程刷新UI
            self.textLabel.text = @"清除緩存(0B)";
        });
        
    }];
    
}

---
+(void)clearFileCache:(NSString *)filePath
{
    [SVProgressHUD showWithStatus:@"正在刪除"];

    [SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeBlack];
    
    NSFileManager * mgr = [NSFileManager defaultManager];
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [mgr removeItemAtPath:filePath error:nil];
        
       dispatch_async(dispatch_get_main_queue(), ^{
           [SVProgressHUD showSuccessWithStatus:@"刪除成功"];
       });
    });
    
}

用戶體驗(yàn)細(xì)節(jié)
1.如果緩存文件非常大,那么應(yīng)該開啟子線程下載
2.當(dāng)前正在計(jì)算過(guò)程中,cell不能被點(diǎn)擊
3.當(dāng)用戶在計(jì)算緩存過(guò)程中,點(diǎn)擊返回按鈕,退出當(dāng)前控制器,那么無(wú)需再回到主線程刷新UI

 // 如果cell已經(jīng)銷毀了, 就直接返回
            if (weakSelf == nil) return;

遇到的bug
1.設(shè)置cell默認(rèn)的文字(如果設(shè)置文字之前userInteractionEnabled=NO, 那么文字會(huì)自動(dòng)變成淺灰色)

  self.textLabel.text = @"清除緩存(正在計(jì)算緩存大小...)";
  self.userInteractionEnabled = NO;

2.block 強(qiáng)引用(block會(huì)對(duì)外部對(duì)象進(jìn)行強(qiáng)引用,直到block執(zhí)行完才會(huì)銷毀)

 __weak typeof(self) weakSelf = self; //__weak修飾

相關(guān)博客:
http://www.reibang.com/p/76614766b2ea
http://www.cnblogs.com/pengyingh/articles/2350345.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庶诡,一起剝皮案震驚了整個(gè)濱河市馅而,隨后出現(xiàn)的幾起案子旗唁,更是在濱河造成了極大的恐慌,老刑警劉巖浦旱,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異九杂,居然都是意外死亡颁湖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門例隆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甥捺,“玉大人,你說(shuō)我怎么就攤上這事镀层×蹋” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吴侦。 經(jīng)常有香客問(wèn)我屋休,道長(zhǎng),這世上最難降的妖魔是什么妈倔? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任博投,我火速辦了婚禮,結(jié)果婚禮上盯蝴,老公的妹妹穿的比我還像新娘毅哗。我一直安慰自己,他們只是感情好捧挺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布虑绵。 她就那樣靜靜地躺著,像睡著了一般闽烙。 火紅的嫁衣襯著肌膚如雪翅睛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天黑竞,我揣著相機(jī)與錄音捕发,去河邊找鬼。 笑死很魂,一個(gè)胖子當(dāng)著我的面吹牛扎酷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遏匆,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼法挨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了幅聘?” 一聲冷哼從身側(cè)響起凡纳,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帝蒿,沒想到半個(gè)月后荐糜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陵叽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年狞尔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巩掺。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偏序,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胖替,到底是詐尸還是另有隱情研儒,我是刑警寧澤豫缨,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站端朵,受9級(jí)特大地震影響好芭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冲呢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一舍败、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敬拓,春花似錦邻薯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至营勤,卻和暖如春灵嫌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葛作。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工寿羞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赂蠢。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓稠曼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親客年。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)漠吻、插件量瓜、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評(píng)論 4 62
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,125評(píng)論 29 470
  • 設(shè)置界面?中清除緩存的處理---** 每個(gè)App幾乎都有清除緩存的功能** 一 手機(jī)上的磁盤緩存 == 從網(wǎng)絡(luò)上下...
    Tuberose閱讀 4,722評(píng)論 12 120
  • 雨絲清清涼涼的 隨風(fēng)飄舞著 親吻著我的額頭 表白著緘默的大地 不知是誰(shuí)在哭泣 還是山河太過(guò)歡喜 一股生命的悲涼 從...
    上官飛鴻閱讀 218評(píng)論 2 9
  • 周五晚上離家出走了,起因是婆婆的語(yǔ)言途乃,導(dǎo)火索是老公的態(tài)度绍傲。周五我和老公說(shuō),老媽讓我們搬出去住耍共,他說(shuō)誰(shuí)讓你讓葡萄哭的...
    馬夢(mèng)兒閱讀 217評(píng)論 0 0