源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

iOS开发之清除缓存功能的实现

  • 时间:2022-03-26 03:26 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:iOS开发之清除缓存功能的实现
[b]前言[/b] 移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为[code]SDWebImage[/code]。但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯、购物、阅读类app的标配功能。 清除缓存基本上都是在设置界面的某一个Cell,于是我们可以把清除缓存封装在某一个自定义Cell中 [b]如下图所示:[/b] [img]http://files.jb51.net/file_images/article/201609/2016923111313364.png?2016823111323[/img] [b]实现的具体步骤[/b] [b]使用注意:[/b]过程中需要用到第三方库,请提前安装好:[code]SDWebImage[/code]、[code]SVProgressHUD[/code]。 [b]1. 创建自定义Cell,命名为GYLClearCacheCell[/b] 重写[code]initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier[/code]方法,设置基本内容,如文字等等; 主要代码如下:
- (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;
}
[b]2. 计算缓存文件大小[/b] 缓存文件包括两部分,一部分是使用[code]SDWebImage[/code]缓存的内容,其次可能存在自定义的文件夹中的内容(视频,音频等内容),于是计算要分两部分 主要代码如下:
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];
}
上述两个方法都是在主线程中完成的,如果缓存文件大小非常大的话,计算时间会比较长,会导致应用卡死,考虑到该问题,因此需要将上述代码放到子线程中完成。 [b]3. 添加手势监听[/b] 对于监听点击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)]];   
 });
[b]4. 清除缓存[/b] 清除缓存也是分为两部分,一是清除[code]SDWebImage[/code]的缓存,二是清除自定义文件缓存 主要代码如下:
- (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;    
   });   
  });
 }];
}
[b]注意点:[/b][code]SDWebImage[/code]清除缓存是在子线程中进行的,清除自定义文件内容应该也放在子线程中(删除大文件可能比较耗时),为了保证两者不冲突,可以将删除自定义文件内容放在[code]SDWebImage[/code]缓存清除完毕之后进行,然后再回到主线程操作。 [b]5. 其他注意点[/b]     a. 在计算文件大小过程中应该是不允许点击Cell的,如果有设置Cell的[code]didSelectRowAtIndexPath[/code]方法,那么会导致手势监听不能使用。于是需要在计算时不能点击Cell。     b. 设置[code]userInteractionEnabled=NO[/code]应放在设置文字之后,否则[code]textLabel[/code]将显示为灰色。     c. 当计算文件大小没有结束的时,这个时候点击返回,自定义Cell不会被销毁,他会执行完剩下的代码,可以使用[code]dealloc[/code]方法来验证,在此情况下,可以使用弱引用的[code]self[/code]来解决。     d. 当设置界面的cell比较多时,如果还在计算缓存大小时,清除缓存的cell从视图中消失,那么加载视图动画就会被停止,当返回到清除缓存cell时,看不到加载动画。[b]解决方案两种方法:一个是在cell创建的代理方法中重新开启动画;另一个是封装到layoutSubviews方法中。 [/b] [b]6. 效果[/b] [img]http://files.jb51.net/file_images/article/201609/2016923111632077.png?2016823111642[/img] [img]http://files.jb51.net/file_images/article/201609/2016923111704339.png?2016823111714[/img] [img]http://files.jb51.net/file_images/article/201609/2016923111737684.png?2016823111745[/img] [b]总结[/b] 以上就是关于iOS中清除缓存功能实现的全部内容,希望这篇文章对各位iOS开发者们能有所帮助,如果有疑问大家可以留言交流。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部