NSURLCache自己的理解
NSURLCache
总结:NSURLCache提供的是内存以及磁盘的综合缓存机制,只会对get请求做缓存,post请求不会缓存数据,不会调用willCacheResponse方法,下一次请求也不会使用缓存,直接发送请求。
get请求:
1.什么时候缓存返回的数据?
无论客户端的request.cachePolicy是什么缓存策略,比如NSURLRequestUseProtocolCachePolicy、NSURLRequestReloadIgnoringLocalCacheData 、NSURLRequestReturnCacheDataElseLoad,无论response有没有Cache-Control,只要Cache-Control没有明确使用no-store,客户端都会缓存这个response,假如Cache-Control: no-store,是不会缓存数据的,客户端没有实现willCacheResponse的话,会自动缓存,默认使用NSURLCacheStorageAllowed,缓存在内存和磁盘,假如客户端实现willCacheResponse的话,可以更改默认的缓存数据,比如更改或添加max-age缓存时间,或者更改为NSURLCacheStorageAllowedInMemoryOnly,只缓存在内存,这是需要创建新的NSCachedURLResponse,因为willCacheResponse传递过来的是不可以更改的,也可以不创建,直接把willCacheResponse传递过来的NSCachedURLResponse,return回去,会缓存起来,也可以ruturn nil,不缓存数据。
结论:不缓存的情况:
(1). Cache-Control: no-store
(2). willCacheResponse return nil
其余都会缓存数据,post等方式除外,默认是磁盘和内存,缓存是在数据返回完成,判断到可以缓存时就自动缓存,或者调用willCacheResponse进行二次处理(实现willCacheResponse的情况下)。
2.什么时候使用缓存?
NSURLRequestUseProtocolCachePolicy:使用服务端缓存策略的话,如果没有缓存直接发送请求,请求完成,缓存数据,如果有缓存,并有max-age的话,判断时候过期,没过期使用缓存,过期发送请求,并缓存。
NSURLRequestReloadIgnoringLocalCacheData:忽略缓存直接发送请求,请求成功会缓存数据。
NSURLRequestReturnCacheDataElseLoad:没有缓存直接请求,请求成功会缓存数据,有缓存不校验过期,直接使用,不请求。
缓存时,NSURLCacheStorageAllowedInMemoryOnly,只缓存在内存,退出应用缓存失效,NSURLCacheStorageAllowed缓存在内存和磁盘,退出应用重启缓存可以使用。
3.Cache-Control: 参数说明:
max-age=60:缓存过期时间为60秒,如果是NSURLRequestUseProtocolCachePolicy,60秒内下一次请求不发送请求,直接返回缓存,60秒后发送请求,由服务端判断是否过期,没过期返回304,过期返回200,结合eTag和if-none-match发送给服务端去判断。NSURLRequestReloadIgnoringLocalCacheData忽略缓存,NSURLRequestReturnCacheDataElseLoad不看过期不过期,只看有没有缓存数据。
no-cache或Pragma:no-cache,客户端会进行缓存,但是下次请求并不使用缓存数据。
no-store,客户端不缓存数据,下次请求也不会使用缓存数据,直接发送请求。
4.Request Cache Headers参数说明:
在默认情况下,NSURLRequest 会用当前时间决定是否返回缓存的数据。为了更精确地控制,允许使用以下请求头:
If-Modified-Since- 这个请求头与 Last-Modified 回应头相对应。把这个值设为同一终端最后一次请求时返回的 Last-Modified 字段的值。
If-None-Match - 这个请求头与与 Etag 回应头相对应。使用同一终端最后一次请求的 Etag 值。
5.Response Cache Headers参数说明:
NSHTTPURLResponse 包含多个 HTTP 头,当然也包括以下指令来说明回应应当如何缓存:
Cache-Control - 这个头 必须由服务器端 指定以开启客户端的 HTTP 缓存功能。这个头的值可能包含 max-age(缓存多久),是公共 public 还是私有 private,或者不缓存no-cache 等信息。详情请参阅 Cache-Control section of RFC 2616。
除了 Cache-Control 以外,服务器也可能发送一些附加的头用于根据需要有条件地请求
Last-Modified - 这个头的值表明所请求的资源上次修改的时间。例如,一个客户端请求最近照片的时间线,/photos/timeline,Last-Modified 的值可以是最近一张照片的拍摄时间。
Etag - 这是 “entity tag” 的缩写,它是一个表示所请求资源的内容的标识符。在实践中,Etag 的值可以是类似于资源的 MD5 之类的东西。这对于那些动态生成的、可能没有明显的 Last-Modified值的资源非常有用。
浙公网安备 33010602011771号