NSURLRequestCachePolicy 缓存策略讲解

前言

在iOS的开发中,对于请求无论是使用NSURLConnection还是NSURLSession都会涉及到缓存策略的使用。有些时候对于缓存策略的不理解可能会导致走很多弯路。

默认缓存策略

NSURLRequestUseProtocolCachePolicy
NSURLRequestReloadIgnoringCacheData
NSURLRequestReturnCacheDataElseLoad
NSURLRequestReturnCacheDataDontLoad

NSURLRequestUseProtocolCachePolicy(常用)

这个是默认缓存策略也是一个比较有用的缓存策略,它会根据HTTP头中的信息进行缓存处理。
此处都说一句,缓存会将获取到的数据缓存的disk。具体验证和详细解析可以看NSURLCache Uses a Disk Cache as of iOS 5
服务器可以在HTTP头中加入Expires和Cache-Control等来告诉客户端应该施行的缓存策略。在后面会详细介绍。

NSURLRequestReloadIgnoringCacheData(偶尔使用)

顾名思义 忽略本地缓存。使用场景就是要忽略本地缓存的情况下使用。

NSURLRequestReturnCacheDataElseLoad(不用)

这个策略比较有趣,它会一直偿试读取缓存数据,直到无法没有缓存数据的时候,才会去请求网络。这个策略有一个重大的缺陷导致它根本无法被使用,即它根本没有对缓存的刷新时机进行控制,如果你要去使用它,那么需要额外的进行对缓存过期进行控制。

NSURLRequestReturnCacheDataDontLoad(不用)

这个选项只读缓存,无论何时都不会进行网络请求。

HTTP缓存策略简介

服务器会在HTTP请求的返回头中带上Cache-Control、Expires、ETag字段用于控制服务器缓存,降低服务器的压力。

当第一次访问服务器的时候,属于初次请求那么服务器需要在Response Header中添加相关策略的属性值。

NSURLRequestCachePolicy 缓存策略讲解_第1张图片
Status 200

快速发起第二次请求,此时请求的Header里面会带上之前请求的Response Header的中的信息。那么此刻服务器不会返回数据,只是会返回一个新的Header文件,里面的HTTP Status Code显示是304(表示缓存未过期)。

NSURLRequestCachePolicy 缓存策略讲解_第2张图片
Status 304

服务器缓存策略

Cache-Control

在第一次请求到服务器资源的时候,服务器需要使用Cache-Control这个响应头来指定缓存策略,它的格式如下:Cache-Control:max-age=xxxx,这个头指指明缓存过期的时间。

  • public: 指示可被任何区缓存
  • private:
  • no-cache: 指定该响应消息不能被缓存
  • no-store: 指定不应该缓存
  • max-age: 指定过期时间
  • min-fresh:
  • max-stable:

Last-Modified和Expires

使用Last-Modified标识由于在资源未修改时返回的response内容为空,可以节省一点带宽,但是还是逃不掉发一个HTTP请求出去,需要浏览器连接一次服务器端。
而Expires标识却使得浏览器干脆连HTTP请求都不用发,但是当用户使用F5或者点击Refresh按钮的时候,就算URI设置了Expires,浏览器一样也会发一个HTTP请求给服务器端,所以,Last-Modified还是要用的,而且要和Expires一起用。
在response的header中的格式为:Expires: Thu, 01 Dec 1994 16:00:00 GMT (必须是GMT格式)

ETag

http/1.1 中增加的header,HTTP协议规格说明定义ETag为“被请求变量的实体值” 。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端。

参考致谢

https://segmentfault.com/a/1190000005833523
http://blog.csdn.net/eroswang/article/details/8302191
http://www.cnblogs.com/guojiao1600/p/5110971.html

你可能感兴趣的:(NSURLRequestCachePolicy 缓存策略讲解)