NSURLCache 为应用的 URL 请求提供了内存以及磁盘上的缓存。当一个请求完成下载来自服务器的回应,一个缓存的回应将在本地保存。下一次同一个请求再发起时,本地保存的回应就会马上返回,不需要连接服务器。NSURLCache 会自动地返回回应。
无论是NSURLConnection、NSURLSession还是UIWebView、WKWebView默认都是有缓存设计的(使用NSURLCache
)。
缓存策略CachePolicy
-
NSURLRequestUseProtocolCachePolicy
:默认缓存策略,对于特定URL使用网络协议中实现的缓存策略。 -
NSURLRequestReloadIgnoringLocalCacheData
(或者reloadIgnoringCacheData):不使用缓存,直接请求原始数据。 -
NSURLRequestReturnCacheDataElseLoad
:无论缓存是否过期,有缓存则使用缓存,否则重新请求原始数据。(在没有网络的情况下本地有缓存的情况下也会使用缓存,并且request不会有error) -
NSURLRequestReturnCacheDataDontLoad
:无论缓存是否过期,有缓存则使用缓存,否则视为失败,不会重新请求原始数据。
NSURLRequestUseProtocolCachePolicy(默认缓存策略)
默认缓存策略(NSURLRequestUseProtocolCachePolicy
)下当客户端发起一个请求时首先会检查本地是否包含缓存,如果有缓存则检查缓存是否过期(通过Cache-Control:max-age或者Expires判断),如果没有过期则直接使用缓存数据。如果缓存过期了,则发起一个请求给服务器端,此时服务器端对比资源Last-Modified或者Etags(二者都存在的情况下下如果有一个不同则认为缓存已过期),如果不同则返回新数据,否则返回304 Not Modified继续使用缓存数据(客户端可以继续使用"max-age"秒缓存数据)。这个过程中客户端发送不发送请求主要看max-age是否过期,而过期后是否继续使用缓存则需要重新发起请求,服务器端根据情况通知客户端是否可以继续使用缓存(返回结果可能是200或者304)。
Set a Cache Policy for URL Requests
Each URLRequest instance contains a URLRequest.CachePolicy object to indicate if and how caching should be performed. You can change this policy to control caching for the request.
For convenience, NSURLSessionConfiguration has a property called requestCachePolicy; all requests created from sessions that use this configuration inherit their cache policy from the configuration.
每一个URLRequest实例都包含了一个
URLRequest.CachePolicy对象表示缓存如何执行。
NSURLSessionConfiguration有一个属性URLCache,用于提供服务器返回的响应的缓存。如果不想缓存,可以把这个属性设置为nil。对于default session,这个属性的默认值是[NSURLCache sharedURLCache]
。
NSLog(@"%lu, %lu", (unsigned long)[NSURLCache sharedURLCache].memoryCapacity, (unsigned long)[NSURLCache sharedURLCache].diskCapacity);
512000, 10000000
sharedURLCache默认提供了512KB的内存缓存和10MB的磁盘缓存。也可以自定义sharedURLCache的缓存大小:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024
diskCapacity:20 * 1024 * 1024
diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];
}
不用多说,NSURLCache只会对你的GET请求进行缓存。
为什么不对post进行缓存?
因为缓存url请求原理就是判断url是否相同,url相同则读取缓存,url不相同则读取服务器。
使用GET方式提交url类似"http://www.example.com/index.jsp?class=articele&page=5“,而POST方式提交url类似http://www.example.com/index.jsp,参数是在HTTPBODY里的,不在URL上,请求参数URL始终相同。