当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS中设置清除缓存功能的实现方法

iOS中设置清除缓存功能的实现方法

2019年07月24日  | 移动技术网IT编程  | 我要评论

才艺表演有哪些,济南贝乐学科英语,沈阳三夫户外

绝大多数应用中都存在着清楚缓存的功能,形形色色,各有千秋,现为大家介绍一种最基础的清除缓存的方法。清除缓存基本上都是在设置界面的某一个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. 使用

创建gylsettingviewcontroller继承自uitableviewcontroller;首先为自定义cell注册;其次在数据源方法中使用自定义cell;具体代码如下:

#import "gylsettingviewcontroller.h"
#import "gylclearcachecell.h"
@implementation gylsettingviewcontroller
static nsstring * const gylclearcachecellid = @"clearcache";
static nsstring * const gylsettingcellid = @"setting";
- (instancetype)init
{
  return [self initwithstyle:uitableviewstylegrouped];
}
- (void)viewdidload
{
  [super viewdidload];
  self.view.backgroundcolor = gylbgcolor;
  self.navigationitem.title = @"设置";
  [self.tableview registerclass:[gylclearcachecell class] forcellreuseidentifier:gylclearcachecellid];
  [self.tableview registerclass:[uitableviewcell class] forcellreuseidentifier:gylsettingcellid];  
}
- (nsinteger)numberofsectionsintableview:(uitableview *)tableview
{
  return 3;
}
- (nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section
{
  return 1;
}
- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath
{ 
  if (indexpath.section == 0 && indexpath.row == 0) {
    return [[gylclearcachecell alloc] initwithstyle:uitableviewcellstylevalue1 reuseidentifier:gylclearcachecellid];   
  }
  uitableviewcell *cell = [tableview dequeuereusablecellwithidentifier:gylsettingcellid];
  cell.textlabel.text = [nsstring stringwithformat:@"section-%zd,row--%zd",indexpath.section,indexpath.row];
  return cell;
}
@end

7. 效果

计算文件大小

正在清除缓存

清除完毕

总结

以上所述是小编给大家介绍的ios中设置清除缓存功能的实现方法,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网