利用NSCache提升效率

转载 2015年11月18日 14:09:34

简介:

在ios中,苹果提供了,NSCache类和NSDictionary很相似,提供key,value的存储,不一样的是NSCache在内存吃紧的时候会做自动释放。

不过在模拟器中模拟内存警告时,缓存不会做清理动作 为了确保接收到内存警告时能够真正释放内存,最好调用一下 removeAllObjects 方法

NSCache 是线程安全的,在多线程操作中,不需要对 Cache 加锁

NSCache 的 Key 只是做强引用,不需要实现 NSCopying 协议

setObject:forKey:cost:
在缓存中设置指定键名对应的值,并且指定该键值对的成本 成本 (cost) 用于计算记录在缓冲中的所有对象的总成本
置对象并指定”成本”,成本可以自行指定

啥叫成本?

例子:缓存图片 缓存 100 张图片 将图片的”宽 * 高”当作成本,图像”像素” 10M 当作缓存成本,无论缓存的多少张照片,只要像素值超过 10M,就自动清理 缓存图像的时候,使用成本,比单纯设置数量要科学!

(void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;

当出现内存警告时,或者超出缓存的总成本上限时,缓存会开启一个回收过程,删除部分元素


例子:

遇到一个问题是,在使用大量图片的app中,需要从存储里面读取数据,每次都从文件系统里面读取文件会造成卡顿现象。

解决办法就是把NSData对象缓存起来,先从NSCache里面读取数据,然后再从文件系统获取数据,提高效率。

方法如下:

步骤1:需要一个单例的NSCache,由于我们的FileUtil本来就是单例的,所以只是需要在初始化FileUtil的时候实例出一个NSCache就行了。

_cache = [[NSCache alloc] init];

步骤2:写文件的时候,把NSData存入NSCache里面

-(void)write:(NSData*)data forKey:(NSString*)key

{

NSString *filepath  = [self filePathForKey:key];

[_cache setObject:data forKey:key];

dispatch_async(fileQueue, ^{

[[NSFileManager defaultManager] createFileAtPath:filepath contents:data attributes:nil];

});

}

步骤3:读文件时候,先从NSCache里面读取,如果没有再从文件系统中读取。从文件系统中读取到的数据,再放回到NSCache中。

-(NSData*)readForKey:(NSString*)key

{

if(key==nil){

return nil;

}

NSData *cacheData = [_cache objectForKey:key];

if(cacheData){

NSLog(@"get data from cache");

return cacheData;

}else{

NSLog(@"miss data from cache");

NSString *filepath =[self filePathForKey:key];

NSData *fileData =  [[NSFileManager defaultManager] contentsAtPath:filepath];

if(fileData){

[_cache setObject:fileData forKey:key];

}

return fileData;

}

}

总结:通过这样的方式,形成了 内存 -> 文件系统  -> 网络图片 的三级图片访问系统。

聊一聊如何提升团队开发效率

又是一年年底了,又到了忙着总结,忙计划的时间了,相信每年的总结计划里,大家都有提高团队开发效率的计划。列了一大堆提升计划和目标。然而,这些计划真的执行了吗?这些目标都完成了吗?     过...
  • lenovouser
  • lenovouser
  • 2016年03月04日 08:58
  • 2567

共享经济:激活存量的最有效方式

移动互联网时代使信息流通无比简单便捷,智能手机等移动设备打破了时间、空间对信息的约束,极大改变了互联网的运行方式,同时在社交化、移动化的促进之下使得共享经济得到了蓬勃发展奠定,并逐渐成为现代商业的显著...
  • wikiWang
  • wikiWang
  • 2016年07月24日 18:20
  • 904

提升数据库效率(一)

1. 原始单据与实体之间的关系   可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原始...
  • u011846436
  • u011846436
  • 2015年10月08日 16:28
  • 621

mysql 利用索引 提升效率

在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表: CREATE TABLE mytable( ID INT NOT NULL, usernam...
  • dazhi_100
  • dazhi_100
  • 2014年05月13日 17:02
  • 2935

从设计到开发,10大不容错过的效率提升工具

工欲善其事必先利其器。好的工具虽不是缔造一位出色的开发者的充分条件,却是必要条件。希望在这篇文章中分享的这些实用性工具可以在优化工作流上帮助到你。 Atom Atom是Gith...
  • wfg18801733667
  • wfg18801733667
  • 2016年08月17日 09:16
  • 1008

NSCache 原理 (著名开源框架SDWebImage 就是使用的NSCache实现的缓存)

NSCache是一个类似于集合的容器,即缓存。它存储key-value对,这一点类似于NSDictionary类。我们通常用使用缓存来临时存储短时间使用但创建昂贵的对象。重用这些对象可以优化性能,因为...
  • u010165653
  • u010165653
  • 2015年06月12日 15:46
  • 1569

NSCache的一点小小认识

NSCache   NSCache是一个类似于集合的容器,即缓存。它存储key-value对,这一点类似于NSDictionary类。我们通常用使用缓存来临时存储短时间使用但创建昂贵的对象。重用这些对...
  • longshihua
  • longshihua
  • 2016年08月15日 17:32
  • 829

DevOps主要通过哪几方面的改变来提升发布软件效率和质量的?

传统的软件运营人员通常倾向于尽量避免修改功能,从而降低满足非功能性需求的风险。但如果拒绝了小的修改,而给定时间段内需要修改的总量不变,那么每次变更的规模就会变大,从而增加每次发布的风险(因为变更涉及的...
  • zuoninger
  • zuoninger
  • 2014年07月25日 16:04
  • 1629

MySQL - 海量数量下的查询效率提升

如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机...
  • cmx8818
  • cmx8818
  • 2016年03月14日 14:27
  • 2175

Java Web项目如何提高访问效率

通常大型应用项目的效率瓶颈一般都是在数据库总结几点数据库效率优化方面应该注意的问题1、 避免使用Hibernate框架   用Hibernate一次性进行5万条左右数据的插入,若ID使用sequenc...
  • a236209186
  • a236209186
  • 2016年05月09日 09:09
  • 580
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用NSCache提升效率
举报原因:
原因补充:

(最多只允许输入30个字)