前言
在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中添加相关策略的属性值。
快速发起第二次请求,此时请求的Header里面会带上之前请求的Response Header的中的信息。那么此刻服务器不会返回数据,只是会返回一个新的Header文件,里面的HTTP Status Code显示是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