媒介
挪動運用在處置收集資本時,普通都邑做離線緩存處置,個中以圖片緩存最為典范,個中很風行的離線緩存框架為SDWebImage
。然則,離線緩存會占用手機存儲空間,所以緩存清算功效根本成為資訊、購物、浏覽類app的標配功效。
消除緩存根本上都是在設置界面的某一個Cell,因而我們可以把消除緩存封裝在某一個自界說Cell中
以下圖所示:
完成的詳細步調
應用留意:進程中須要用到第三方庫,請提早裝置好:SDWebImage
、SVProgressHUD
。
1. 創立自界說Cell,定名為GYLClearCacheCell
重寫initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
辦法,設置根本內容,如文字等等;
重要代碼以下:
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { // 設置加載視圖 UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; [loadingView startAnimating]; self.AccessoryView = loadingView; //設置文字 self.textLabel.text = @"清晰緩存"; self.detailTextLabel.text = @"正在盤算"; } return self; }
2. 盤算緩存文件年夜小
緩存文件包含兩部門,一部門是應用SDWebImage
緩存的內容,其次能夠存在自界說的文件夾中的內容(視頻,音頻等外容),因而盤算要分兩部門
重要代碼以下:
unsigned long long size = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"CustomFile"].fileSize; //fileSize是封裝在Category中的。 size += [SDImageCache sharedImageCache].getSize; //CustomFile + SDWebImage 緩存 //設置文件年夜小格局 NSString sizeText = nil; if (size >= pow(10, 9)) { sizeText = [NSString stringWithFormat:@"%.2fGB", size / pow(10, 9)]; }else if (size >= pow(10, 6)) { sizeText = [NSString stringWithFormat:@"%.2fMB", size / pow(10, 6)]; }else if (size >= pow(10, 3)) { sizeText = [NSString stringWithFormat:@"%.2fKB", size / pow(10, 3)]; }else { sizeText = [NSString stringWithFormat:@"%zdB", size]; }
上述兩個辦法都是在主線程中完成的,假如緩存文件年夜小異常年夜的話,盤算時光會比擬長,會招致運用卡逝世,斟酌到該成績,是以須要將上述代碼放到子線程中完成。
3. 添加手勢監聽
關於監聽點擊Cell可使用署理也能夠應用手勢監聽,為了將完全的功效封裝到自界說Cell中,因而我們應用手勢監聽的辦法來監聽點擊Cell。
//盤算完成後,回到主線程持續處置,顯示文件年夜小,除去加載視圖,顯示箭頭,添加點擊事宜 dispatch_async(dispatch_get_main_queue(), ^{ self.detailTextLabel.text = [NSString stringWithFormat:@"%@",sizeText]; self.AccessoryView = nil; self.AccessoryType = UITableViewCellAccessoryDisclosureIndicator; [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithtarget:self action:@selector(clearCacheClick)]]; });
4. 消除緩存
消除緩存也是分為兩部門,一是消除SDWebImage
的緩存,二是消除自界說文件緩存
重要代碼以下:
- (void)clearCacheClick { [SVProgressHUD showWithStatus:@"正在消除緩存···"]; [SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeBlack]; [[SDImageCache sharedImageCache] clearDiskOnCompletion:^{ dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSFileManager *mgr = [NSFileManager defaultManager]; [mgr removeItemAtPath:GYLCustomFile error:nil]; [mgr createDirectoryAtPath:GYLCustomFile withIntermediateDirectories:YES attributes:nil error:nil]; dispatch_async(dispatch_get_main_queue(), ^{ [SVProgressHUD dismiss]; // 設置文字 self.detailTextLabel.text = nil; }); }); }]; }
留意點:SDWebImage
消除緩存是在子線程中停止的,消除自界說文件內容應當也放在子線程中(刪除年夜文件能夠比擬耗時),為了包管二者不抵觸,可以將刪除自界說文件內容放在SDWebImage
緩存消除終了以後停止,然後再回到主線程操作。
5. 其他留意點
a. 在盤算文件年夜小進程中應當是不許可點擊Cell的,假如有設置Cell的didSelectRowAtIndexPath
辦法,那末會招致手勢監聽不克不及應用。因而須要在盤算時不克不及點擊Cell。
b. 設置userInteractionEnabled=NO
應放在設置文字以後,不然textLabel
將顯示為灰色。
c. 當盤算文件年夜小沒有停止的時,這個時刻點擊前往,自界說Cell不會被燒毀,他會履行完剩下的代碼,可使用dealloc
辦法來驗證,在此情形下,可使用弱援用的self
來處理。
d. 當設置界面的cell比擬多時,假如還在盤算緩存年夜小時,消除緩存的cell從視圖中消逝,那末加載視圖動畫就會被停滯,當前往到消除緩存cell時,看不到加載動畫。處理計劃兩種辦法:一個是在cell創立的署理辦法中從新開啟動畫;另外一個是封裝到layoutSubviews辦法中。
6. 後果
總結
以上就是關於IOS中消除緩存功效完成的全體內容,願望這篇文章對列位IOS開辟者們能有所贊助,假如有疑問年夜家可以留言交換。
【iOS開辟之消除緩存功效的完成】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!