ios开发清除SDWebImage图片缓存
一:一般在实际的项目应用中都会用到第三方框架SDWebImage去下载缓存图片,但在ios开发应用中,常常涉及对SDWebImage缓存图片的清除。本文所列出代码即是对SDWebImage缓存图片的清除。
二:代码:
- (void)setGroup1 { RHCommonSection *section = [RHCommonSection commonSection];
section.header = @"第1组头部";
section.footer = @"第1组尾部"; //清除SD的图片缓存
NSString *path = [SDImageCache sharedImageCache].diskCachePath;
long long imageSize = [path fileSize];
NSString *fileSize = [NSString stringWithFormat:@"%.1f",imageSize/1024.0/1024.0];
RHSwitchItem *item1 = [RHSwitchItem commonItemWithTitle:@"清除缓存" icon:@"game_center"];
item1.subTitle = [NSString stringWithFormat:@"%@ M",fileSize];
self.item1 = item1;
__weak typeof (item1) weakItem1 = item1;
item1.cellBlock = ^(){ if (!path) return ; NSFileManager *manager = [NSFileManager defaultManager];
BOOL fileExits = [manager fileExistsAtPath:path];
if (fileExits) {
[MBProgressHUD showHudWithMessage:@"正在清除缓存"];
[manager removeItemAtPath:path error:nil];
weakItem1.subTitle = nil;
[self.tableView reloadData];
[MBProgressHUD hideHud];
}
}; RHSwitchItem *item2 = [RHSwitchItem commonItemWithTitle:@"周边" icon:@"near"];
RHSwitchItem *item3 = [RHSwitchItem commonItemWithTitle:@"应用" icon:@"app"]; section.itemsArr = @[item1,item2,item3];
[self.groups addObject:section]; } //回调时,调用block执行清除缓存操作
- (void)actionSheetViewController:(RHActionSheetViewController *)actionViewVC actionView:(RHActionSheetView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { switch (buttonIndex) {
case :
[self clearMemory];
break;
default:
DLog(@"点击了取消----------");
} } - (void)clearMemory { if (self.item1.cellBlock) { self.item1.cellBlock();
} }
//其中计算图片缓存大小的操作,写在了NSString的一个分类里,目的是:项目也许其他地方也会用到计算缓存的大小操作,所以将计算缓存大小的逻辑封装起来 @interface NSString (Cqb) - (long long)fileSize; @end
#import "NSStrig+Cqb.h" @implementation NSString (Cqb) - (long long)fileSize { NSFileManager *manager = [NSFileManager defaultManager]; //1:先判断该路径下是否存在缓存文件 BOOL isDirectory = NO;//该文件目录下是否存在文件夹,默认为NO
BOOL fileExist = [manager fileExistsAtPath:self isDirectory:&isDirectory];
if (!fileExist) return ; //2:判断是文件还是文件夹 if (isDirectory) {//是文件夹
NSArray *subPaths = [manager contentsOfDirectoryAtPath:self error:nil];
long long totalFileSize = ; for (NSString *path in subPaths) {
NSString *fullPath = [self stringByAppendingPathComponent:path];
totalFileSize += [fullPath fileSize]; }
return totalFileSize;
}else {
NSDictionary *attribute = [manager attributesOfItemAtPath:self error:nil];
return [attribute[NSFileSize] longLongValue];
} } @end
三:所用知识点:
1:NSString *path = [SDImageCache sharedImageCache].diskCachePath; 获取path是SD缓存图片的路径,打印路径,前往文件夹,如图:
其中diskCachePath只在sharedImageCache的.m中声明了,灭有对外暴露接口,以属性声明diskCachePath,则在其.m文件中自动生成下划线成员变量,setter,getter方法,如果想获得缓存路径,需要在.h中提供getter方法。
/**
* 项目中SD缓存图片的路径
*/
- (NSString*)diskCachePath;
2: long long imageSize = [path fileSize];将计算图片缓存大小的方法封装起来,为了项目中其他地方可用。为NSString写一个分类,对象方法,返回字节数B,用long long 作为返回类型。计算缓存大小的思路为:1:将计算图片缓存大小的方法封装起来,为了项目中其他地方可用,因为可以获得文件路径,所以为NSString写分类(对象或是类方法可供选择,本文此处选择对象方法,传入path,返回long long 字节数)2:先判断文件路径是否存在,不存在直接retun 0;若存在,则先判断该路径下是否存在文件夹, BOOL isDirectory = NO;//该文件目录下是否存在文件夹,默认为NO
BOOL fileExist = [manager fileExistsAtPath:self isDirectory:&isDirectory]; 3:若存在文件夹,则获取该文件夹下所有文件的子路径,并返回一个子路径数组: NSArray *subPaths = [manager contentsOfDirectoryAtPath:self error:nil];遍历数组,得到该文件夹下每一个子文件名,拼接路径得到全路径,4:定义totalSize,利用递归计算出文件的总大小并返回 long long totalFileSize = 0; for (NSString *path in subPaths) { NSString *fullPath = [self stringByAppendingPathComponent:path]; totalFileSize += [fullPath fileSize]; } return totalFileSize; 4:若为文件,直接计算出文件大小, NSDictionary *attribute = [manager attributesOfItemAtPath:self error:nil]; return [attribute[NSFileSize] longLongValue];
3:计算M: NSString *fileSize = [NSString stringWithFormat:@"%.1f",imageSize/1024.0/1024.0];%.1f为保留一位小数,为浮点类型,所以imageSize/1024.0/1024.0,1024也要表示为浮点型数据
4:清除缓存:利用block回调,调用block,思路:先判断路径是否存在,不存在直接返回,若存在,在判断该路径下文件是否存在,不存在直接返回,若存在则利用文件管理manager清除文件,在文件清除成功后,相应cell上的数据也要清除,赋值为nil,并要刷新表格才能显示。此时刷新表格,也可以只刷数据改变的indexPath
5: __weak typeof (item1) weakItem1 = item1; 此处在block内部引起了循环引用,原因是在model数据中属性定义了回调block,model对block有一个强引用,而block内部会对引用的变量有一个强引用,所以对model的对象item1也有一个强引用,则会造成循环引用,解决办法:__weak typeof (item1) weakItem1 = item1
ios开发清除SDWebImage图片缓存的更多相关文章
- iOS开发网络篇—数据缓存
iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...
- iOS网络加载图片缓存策略之ASIDownloadCache缓存优化
iOS网络加载图片缓存策略之ASIDownloadCache缓存优化 在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...
- Fast Image Cache – iOS 应用程序高性能图片缓存
Fast Image Cache 是一种在 iOS 应用程序中高效.持续.超快速的存储和检索图像的解决方案.任何良好的 iOS 应用程序的用户体验都应该是快速,平滑滚动的,Fast Image Cac ...
- SDWebImage 图片缓存机制
SDWebImage与iOS系统自带的缓存相比,优势是什么? 从iOS5开始,iOS NSURLCache对于原生得HTTP Response做内存和磁盘缓存.每一次缓存命中(缓存命中就是说内存或者磁 ...
- iOS开发需要哪些图片?
1.产品设计图 可以以6的长宽比 750*1134来设计.这些图片用于描述app是什么样子的,这是app开发人员的开发参考. 2.产品切图 将设计师将设计稿切成可以用来开发的图 颜色值 iOS颜色值取 ...
- tableView异步下载图片/SDWebImage图片缓存原理
问题说明:假设tableView的每个cell上的imageView的image都是从网络上获取的数据.如何解决图片延迟加载(显示很慢).程序卡顿.图片错误显示.图片跳动的问题. 需要解决的问题: 1 ...
- iOS网络加载图片缓存与SDWebImage
加载网络图片可以说是网络应用中必备的.如果单纯的去下载图片,而不去做多线程.缓存等技术去优化,加载图片时的效果与用户体验就会很差. 一.自己实现加载图片的方法 tips: *iOS中所有网络访问都是异 ...
- iOS开发讲解SDWebImage,你真的会用吗?
SDWebImage作为目前最受欢迎的图片下载第三方框架,使用率很高.但是你真的会用吗?本文接下来将通过例子分析如何合理使用SDWebImage. 使用场景:自定义的UITableViewCell上有 ...
- IOS开发-第三方SDWebImage下载网络图片的使用
从网络上请求图片时,没有使用第三方的话,下载会很慢,而且堵塞线程,还要自己处理多线程问题,效果还非常不明显,使用了SDWebImage这个第三方类库之后,下载图片就变的容易多了. SDWebImage ...
随机推荐
- layoutParams-动态更改某个控件的margin
其实它的方法也非常的简单,如下 LinearLayout.LayoutParams layoutParams = (LayoutParams) bt1.getLayoutParams(); int a ...
- 前端项目中常用es6知识总结 -- Promise逃脱回调地狱
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...
- 洛谷 P1308 统计单词数
P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...
- 疯狂html5讲义(二):HTML5简的经常使用元素与属性(二):html5新增的通用属性
1.contentEditable属性 true时可直接编辑html元素里面的内容.且具有"可继承"的特点. 编辑后不要刷新页面.否则编辑的内容会丢失,能够通过该元素的innerH ...
- 如何从mysql数据库中取到随机的记录
如何从mysql数据库中取到随机的记录 一.总结 一句话总结:用随机函数newID(),select top N * from table_name order by newid() ----N是一个 ...
- Linux下读写寄存器
arm裸机下读写寄存器很容易,各个寄存器和内存的地址是单一地址空间,他们是用相同的指令进行读写操作的.而在linux下就要复杂很多,因为linux支持多个体系架构的CPU.比如arm和x86就不一样, ...
- C++中引用传递与指针传递区别
C++中引用传递与指针传递区别 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程 ...
- P2P平台项目建设几点注意事项
种选择 a.资金池,接入第三方支付,财付通,宝付等,比如一起好 b.第三方资金托管,易宝支付.汇付天下等 c.银行存管,资金放在银行 资金池政策风险,不得不考虑. 每一种模式,技术实现都有变化,需要考 ...
- C# SocketAsyncEventArgs类
Namespace:System.Net.Sockets Assemblies:System.Net.Sockets.dll, System.dll, netstandard.dll (Represe ...
- Mysql从入门到精通整理
目录 mysql基础 mysql进阶 mysql高级 mysql优化 正文 数据库是信息化产业的最基础的软件之一,各种管理系统,网站,在线游戏,背后基本都会有数据库的支持. 回到顶部 mysql基础 ...