详细解析几个和网络请求有关的类(十) —— 理解获取缓存(六)

版本记录

版本号 时间
V1.0 2018.03.12

前言

我们做APP发起网络请求,一般都是使用框架,这些框架的底层也都是苹果的API,接下来几篇就一起来看一下和网络有关的几个类。感兴趣的可以看上面几篇文章。
1. 详细解析几个和网络请求有关的类 (一) —— NSURLSession
2. 详细解析几个和网络请求有关的类(二) —— NSURLRequest和NSMutableURLRequest
3. 详细解析几个和网络请求有关的类(三) —— NSURLConnection
4. 详细解析几个和网络请求有关的类(四) —— NSURLSession和NSURLConnection的区别
5. 详细解析几个和网络请求有关的类(五) —— 关于NSURL加载系统(一)
6. 详细解析几个和网络请求有关的类(六) —— 使用NSURLSession(二)
7. 详细解析几个和网络请求有关的类(七) —— URL数据的编码和解码(三)
8. 详细解析几个和网络请求有关的类(八) —— 处理重定向和其他请求更改(四)
9. 详细解析几个和网络请求有关的类(九) —— 身份验证挑战和TLS链验证(五)

回顾

上一篇主要讲述身份验证挑战和TLS链验证,这里我们就看一下关于获取缓存方面的理解。


Understanding Cache Access - 理解缓存的获取

URL加载系统提供了对请求的响应的复合磁盘和内存缓存。 此缓存允许应用程序减少对网络连接的依赖并提高其性能。


Using the Cache for a Request - 使用缓存进行请求

NSURLRequest实例通过将缓存策略设置为NSURLRequestCachePolicy值之一来指定本地缓存的使用方式:NSURLRequestUseProtocolCachePolicyNSURLRequestReloadIgnoringCacheDataNSURLRequestReturnCacheDataElseLoadNSURLRequestReturnCacheDataDontLoad

NSURLRequest实例的默认缓存策略是NSURLRequestUseProtocolCachePolicyNSURLRequestUseProtocolCachePolicy行为是协议特定的,并被定义为协议的最佳符合策略。

将缓存策略设置为NSURLRequestReloadIgnoringCacheData将导致URL加载系统从原始源加载数据,并完全忽略缓存。

NSURLRequestReturnCacheDataElseLoad缓存策略会导致URL加载系统使用缓存数据,忽略其时间或到期日期,并且仅在没有缓存版本时才从原始源加载数据。

NSURLRequestReturnCacheDataDontLoad策略允许应用程序指定只返回缓存中的数据。如果响应不在本地缓存中,尝试使用此缓存策略创建NSURLSessionTask实例将立即返回nil。这在功能上与“脱机”模式类似,并且永远不会启动网络连接。

注意:目前只缓存对HTTP和HTTPS请求的响应。 FTP和file协议尝试访问缓存策略允许的发起源。自定义NSURLProtocol类可以选择性的提供缓存。


Cache Use Semantics for the HTTP Protocol - 缓存使用HTTP协议的语义

最复杂的缓存使用情况是当请求使用HTTP协议并将缓存策略设置为NSURLRequestUseProtocolCachePolicy时。

如果请求中不存在NSCachedURLResponse,则URL加载系统将从原始源获取数据。

如果请求存在缓存的响应,则URL加载系统会检查响应以确定它是否指定内容必须重新生效。

如果内容必须重新生效,则URL加载系统会向始发源发出HEAD请求,以查看资源是否已更改。如果它没有改变,那么URL加载系统返回缓存的响应。如果它已更改,则URL加载系统将从原始源中提取数据。

如果缓存的响应未指定必须重新验证内容,则URL加载系统将检查缓存响应中指定的最大使用期限或到期日期。如果缓存的响应足够接近最近的时间,则URL加载系统返回缓存的响应。如果响应失效,则URL加载系统向始发源发出HEAD请求以确定资源是否已更改。如果是这样,则URL加载系统从原始源获取资源。否则,它返回缓存的响应。

RFC 2616第13节(http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13)详细说明了详细涉及的语义。


Controlling Caching Programmatically - 以编程方式控制缓存

默认情况下,根据请求的缓存策略对请求的数据进行缓存,正如处理请求的NSURLProtocol子类所解释的那样。

如果您的应用程序需要对缓存进行更精确的编程控制(并且协议支持缓存),则可以实现代理方法,以便应用程序根据每个请求确定是否应缓存特定的响应。

对于NSURLSession数据和上传任务,实现URLSession:dataTask:willCacheResponse:completionHandler:方法。此委托方法仅用于数据和上载任务。下载任务的缓存策略由指定的缓存策略独占决定。

对于NSURLSession,您的代理方法调用完成处理程序块来告诉会话要缓存的内容。代理通常会提供以下一个值:

  • 提供的响应对象以允许缓存
  • 新创建的响应对象来缓存修改后的响应 - 例如,具有允许将内容缓存到内存但不保存到磁盘的存储策略的响应
  • nil以防止缓存

您的代理方法还可以将对象插入到与NSCachedURLResponse对象关联的userInfo字典中,从而将这些对象作为响应的一部分存储在缓存中。

重要:你的代理方法必须调用提供的完成处理handler,否则会引起内存泄露。

Listing 5 - 1 中的例子阻止了HTTPS响应的磁盘缓存。 它还会将当前日期添加到用户信息字典中以缓存响应。

// Listing 5-1  Example URLSession:dataTask:willCacheResponse:completionHandler: implementation

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
 willCacheResponse:(NSCachedURLResponse *)proposedResponse
 completionHandler:(void (^)(NSCachedURLResponse * __nullable cachedResponse))completionHandler {
    NSCachedURLResponse *newCachedResponse = proposedResponse;
    NSDictionary *newUserInfo;
    newUserInfo = [NSDictionary dictionaryWithObject:[NSDate date]
                                              forKey:@"Cached Date"];
    if ([proposedResponse.response.URL.scheme isEqualToString:@"https"]) {
#if ALLOW_IN_MEMORY_CACHING
        newCachedResponse = [[NSCachedURLResponse alloc]
                             initWithResponse:proposedResponse.response
                             data:proposedResponse.data
                             userInfo:newUserInfo
                             storagePolicy:NSURLCacheStorageAllowedInMemoryOnly];
#else // !ALLOW_IN_MEMORY_CACHING
        newCachedResponse = nil;
#endif // ALLOW_IN_MEMORY_CACHING
    } else {
        newCachedResponse = [[NSCachedURLResponse alloc]
                             initWithResponse:[proposedResponse response]
                             data:[proposedResponse data]
                             userInfo:newUserInfo
                             storagePolicy:[proposedResponse storagePolicy]];
    }
 
    completionHandler(newCachedResponse);
}

后记

本篇主要介绍了关于缓存获取方面的内容,喜欢的给个关注,谢谢~~~

详细解析几个和网络请求有关的类(十) —— 理解获取缓存(六)_第1张图片

你可能感兴趣的:(详细解析几个和网络请求有关的类(十) —— 理解获取缓存(六))