close
当前位置: 物联网在线 > 技术文库 > ios >

iOS~URLCache探索

一个随时需要进行HTTP请求的完善的iOS应用,为了流畅的体验,用户流量的节省,缓存是不得不考虑的需求。值得庆幸的是,Apple已经为开发者们做好了这一切,接下来,就一起研究一下一个被很多开发者忽略的类:NSURLCache。

了解NSURLCahe

NSURLCache类用NSURLRequest对象和NSCachedURLResponse对象的一对一映射关系实现了请求数据的缓存。它同时提供内存缓存和硬盘缓存,你可以分别自定义内存缓存和硬盘缓存的大小,同时也可以自定义硬盘缓存的目录。

这是官方文档对NSURLCache的描述。其中NSURLRequest对象是请求对象,不必多说。NSCachedURLResponse对象是对缓存数据的封装,其中的data属性是请求回来的JSON(或者其他格式)的二进制数据。

以下是NSURLCache类提供的方法,基本能够满足大多数的缓存需求。

@interface NSURLCache : NSObject /** 缓存类的单例 */ @property (class, strong) NSURLCache *sharedURLCache; /** 初始化方法 */ - (instancetype)initWithMemoryCapacity:(NSUInteger)memoryCapacity diskCapacity:(NSUInteger)diskCapacity diskPath:(nullable NSString *)path; /** 取得缓存数据的方法 */ - (nullable NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request; /** 存储缓存数据的方法 */ - (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request; /** 删除指定request的缓存 */ - (void)removeCachedResponseForRequest:(NSURLRequest *)request; /** 删除全部缓存 */ - (void)removeAllCachedResponses; /** 删除缓存数据的一部分 */ - (void)removeCachedResponsesSinceDate:(NSDate *)date; /** 内存缓存的大小 单位:字节 */ @property NSUInteger memoryCapacity; /** 硬盘缓存的大小 单位:字节 */ @property NSUInteger diskCapacity; /** 当前可用的内存缓存大小 单位:字节 */ @property (readonly) NSUInteger currentMemoryUsage; /** 当前可用的硬盘缓存大小 单位:字节 */ @property (readonly) NSUInteger currentDiskUsage; @end

缓存工作过程的理解

事实上,就算什么也不写,系统也会根据默认的规则帮你缓存HTTP请求。但是项目中诸多的逻辑往往并不能让我们如此悠闲。

此处举一个小例子:项目中的请求一般都需要把参数加密,一般的加密算法,同样一个请求,每次加密出来的串都是不一样的。上面说过,NSURLCache是用NSURLRequest作为Key来实现缓存的,每次的URL不同导致每次取到的缓存都为空。这时候就需要做一些事情来保证缓存系统按照我们期望的样子正常运行。

我自己的理解和总结,NSURLCache的工作过程是这样的:

1.请求前的配置,包括请求头,响应头,超时时间以及缓存策略(后面会说到有关缓存策略)。

2.真正去服务器请求前,判断缓存策略,调用cachedResponseForRequest:(NSURLRequest *)request方法试着取缓存或者直接请求网络。

3.如果缓存策略允许取缓存,并且取到了缓存,请求成功并且返回缓存数据。

4.如果缓存策略允许取缓存,并且没有取到缓存,再次判断缓存策略,如果缓存策略允许联网,则联网请求,否则,请求失败。

5.上述2,3任何一种请求成功的话,判断缓存策略和服务器返回的响应头。如果允许存储,则调用storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request将返回的数据存储到内存以及硬盘,否则,直接返回请求成功。

下面是Apple提供的7种缓存策略以及含义:

iOS~URLCache探索

如果使用了默认缓存策略,也就是上面表格中第一个,需要从返回的response的header中获取相应的字段来指导缓存该如何进行。

1.Cache-Control字段:常用的有 no-cache,no-store,和max-age。其中no-cache代表不能使用这个缓存,no-store代表不存储这个数据,max-age代表缓存的有效期(单位为秒)。

2.Expires字段:缓存过期时间,后面跟一个日期,此日期之前都可以直接使用本缓存。如果Expires与Cache-Control同时存在,则Cache-Control优先。

3.Last-Modified和If-Modified-Since字段:如果response中有Last-Modified,则在下次请求时,给request的header设置If-Modified-Since为Last-Modified的值,服务器校验数据是否有变化,如果有变化,返回新数据,否则,返回304状态码,可以使用此缓存。

4.ETag和If-None-Match字段:如果response中有ETag,则在下次请求时,给request的header设置If-None-Match为ETag的值,服务器校验数据是否有变化,如果有变化,返回新数据,否则,返回304状态码,可以使用此缓存。

以上的缓存协议字段只是我所了解的比较常见的几种,当然HTTP缓存协议还包括很多很多的内容,有兴趣的同学可以自行了解。

Demo应用

为了加深理解,我写了一个小Demo来探索NSURLCache的运行过程。

Demo很简单,只有WXYRequest请求类,继承自NSURLCache的自定义WXYURLCache类和发起请求的ViewController控制器。


(责任编辑:ioter)

用户喜欢...

关于高压输电的探索:电网换相换流器

据美国能源信息管理局统计,2014年美国能源的平均零售价格为10.44美分/千瓦时,预计输配电损耗为5%。这一损耗值似...


探索如何应用快如闪电的内部补偿式ACM拓扑

具有内部补偿的高级电流模式(ACM)是TI开发的一款新型控制拓扑,可以支持真定频调制并与内部补偿同步。从根本上来...


文本挖掘小探索:避孕药内容主题分析

作者:冯大福 舆情监测一直是众多品牌关注的地方,尤其品牌想知道在品牌推广,品牌策略,品牌广告中出现的问题...


手把手教学:使用Elastic search和Kibana进行数据探索(Python语言)

探索性数据分析(EDA)帮助我们认识底层的数据基结构及其动力学,以此来最大限度发掘出数据的可能性。EDA是提取...


一个优雅地探索相关性的新可视化方法

一个古老的诅咒一直萦绕着数据分析:我们用来改进模型的变量越多,那么我们需要的数据就会出现指数级的增长。...


鎏云物联:专注物联网连接服务新形态 探索建立运营商合作桥梁

鎏云物联:专注物联网连接服务新形态 探索建立运营商合作桥梁,C114讯 7月26日消息(南山)中国物联网产业发展快速...


探索并行领域—并行设计即将来临

摩尔定律的影响已经开始减弱,但人们对性能的需求并没有减弱。为此,整个行业似乎已经踏上了一条开发多核处理器及其更庞大的同类产品——异构多核系统的道路。这一发展预计将会极大...


大数据应用价值发现的三大方法

大数据价值的发现与其所处的应用场景密切相关。概括起来,大数据价值发现可以划分为三大类:数据服务、数据分...


[Unity3D]Unity3D游戏开发之继续探索NGUI

博主最近开始研究NGUI了,可是说实话,博主感觉NGUI的东西似乎有些分散,因为网上大部分的资料都只是简单地讲解如何使用NGUI,并没有从实质性的原理出发来讲解NGUI的内涵,这就和我们学...


大联大友尚集团推出的ST NFC阅读器芯片和探索套件,让工程师先人一步

大联大控股宣布,其旗下友尚推出意法半导体(ST)探索套件ST25R3911B-DISCO整合ST25R3911B NFC阅读器芯片和STM32L476RE超低功耗微控制器,能够缩短非接应用的研发周期,取得优异的通信距离、速度...