URL加载系统之五

ios- NSURLRequest缓存策略以及NSURLConnection发送异步请求,

关于NSURLRequest的下面的这个方法缓存策略的举例

[NSURLRequest requestWithURL:url cachePolicy:policy timeoutInterval:1]

NSURLRequestUseProtocolCachePolicy = 0, 默认的缓存策略
NSURLRequestReloadIgnoringLocalCacheData = 1,
忽略本地缓存数据,直接去加载网络数据 这样的好处就是数据可以实时的更新
NSURLRequestReturnCacheDataElseLoad = 2,
使用缓存数据,忽略其过期时间;只有在没有缓存版本的时候才从源端加载数据。
NSURLRequestReturnCacheDataDontLoad = 3,
返回缓存的数据,如果没有缓存的数据就请求失败

其中对于默认的缓存策略的描述如下所示摘抄网络

如果请求的缓存响应不存在,则URL加载系统直接从源端加载数据;
否则,如果缓存响应中没有明确表示每次请求必须重新验证,则如果不是响应的缓存过期了,则URL加载系统会返回缓存数据

如果缓存的响应过期或者需要重新验证,URL加载系统发送HEAD请求到源端,查看资源是否发生了变化。如果变化了,则URL加载系统取出从始发源的数据。否则,它返回缓存的响应。

补充一下

NSURLResponse中的属性
URL
服务器返回的URL,大多数情况下和我们请求的URL是一样的,但是有的时候可能会有重定向的情况产生
MIMEType 二进制数据的文件类型
expectedContentLength 下载文件的长度
textEncodingName 文本编码名称
suggestedFilename 服务器建议的保存的文件的名称
NSHTTPURLResponse 的属性
statusCode 状态码
allHeaderFields 所有响应头的信息

NSURLRequest缓存策略以及NSURLConnection发送异步请求,
关于NSURLRequest的下面的这个方法缓存策略的举例 [NSURLRequest
requestWithURL:url cachePolicy…

缓存

URL加载系统为请求提供了基于磁盘和内存的组合响应缓存。这个缓存让应用减少了对网络连接的依赖,提高了性能。

一个NSURLRequest实例通过设置缓存策略来指定本地缓存。默认的缓存策略是NSURLRequestUseProtocolCachePolicy,其行为是由协议指定的针对该协议最好的实现方式。另外几种缓存策略描述如下:

NSURLRequestReloadIgnoringCacheData:URL加载系统将从服务端加载数据,而完全忽略缓存。

NSURLRequestReturnCacheDataElseLoad:URL加载系统使用缓存数据,忽略其过期时间;只有在没有缓存版本的时候才从源端加载数据。

NSURLRequestReturnCacheDataDontLoad:允许应用指定只有在缓存中的数据应该被返回。如果在创建NSURLConnection或NSURLDownload实例时使用这个缓存策略,如果响应没有在本地缓存中,则直接返回nil。这类似于使用离线模式,且从来不进行网络连接。

需要注意的是,目前只有HTTP和HTTPS的响应还被缓存。

永利澳门游戏网址304,缓存最常用的场景是使用HTTP协议做网络请求,同时设置缓存策略为NSURLRequestUseProtocolCachePolicy。如果一个请求的NSCachedURLResponse不存在,则加载系统会从源端获取数据。如果请求的缓存响应存在于本地,则URL加载系统检查响应来确定它指定的内容必须被重新验证。如果内容必须验证,则加载系统发出一个HEAD请求到源端以确定资源是否已经改变。如果没有改变,则URL加载系统返回缓存响应对象。如果已经改变了,则URL加载系统从源端获取数据。

如果缓存响应对象没有指定内容必须被重新验证,则加载系统校验缓存响应对象的最大age或有效时间。如果缓存对象未过期,则加载系统返回缓存对象。如果响应过旧,则URL加载系统发起一个HEAD请求到源端查看资源是否已被修改。如果修改了,则URL加载系统从源端获取新的数据。否则,返回缓存响应对象。

默认情况下,连接的数据基于请求的缓存策略来进行缓存,同时由处理请求的NSURLProtocol子类来解析。如果我们需要对缓存做更精确的控制,我们可以实现一些代理方法来允许应用来确定请求是否应该缓存:

对于NSURLSession数据和上传任务,实现URLSession:dataTask:willCacheResponse:completionHandler:方法。这个代理方法只用于数据请求和上传任务。而下载任务的缓存由指定的缓存策略来决定。

对于NSURLConnection,实现connection:willCacheResponse:方法

对于NSURLSession,我们的代理方法调用一个完成处理器block来告知会话需要缓存什么东西。对于NSURLConnection,代理方法返回连接需要缓存的对象。不管是哪种情况,代理都会提供以下值之一:

允许缓存的响应对象

发表评论

电子邮件地址不会被公开。 必填项已用*标注