我希望我的数据总是从服务器获取,除非没有网络。然后,我希望返回缓存的数据。因此,无论是否存在网络,我的用户总是得到一些数据(而不是告诉他们:不是网络连接之类的)。那么,我应该使用哪一个NSURLRequestCachePolicy呢?
发布于 2014-09-11 18:34:01
“我希望我的数据总是从服务器获取,除非没有网络。然后我希望返回缓存的数据。”
缓存策略常量在这里描述。
所有缓存策略都不像您所描述的那样。如果服务器不可用,您可以通过为缓存外的响应提供服务来实现自己的缓存逻辑(不过,这并不是真正推荐的)。
您的问题没有描述您希望缓存的响应是否被持久化到磁盘。默认情况下,NSURLCache仅在内存中缓存,您可以创建一个NSURLCache实例,该实例可以轻松地使用磁盘:
cache = [[NSURLCache alloc] initWithMemoryCapacity:[(1024*1024*512) diskCapacity:(1024*1024*1024 * 100) diskPath:@"Cache.db"]:缓存可以设置为全局共享URL缓存,也可以与NSURLSessionConfiguration一起使用。
当您决定您的应用程序不应试图与服务器联系时,可以通过请求的缓存响应。直接访问缓存。
cachedResponse = [cache cachedResponseForRequest:request];缓存的响应是一个NSCachedURLResponse,它包含与该请求的响应的缓存表示相关联的NSData和NSURLResponse。然后,您可以将这些对象交给您为处理来自服务器的响应而实现的任何方法。
也就是说,使用NSURLRequestUseProtocolCachePolicy的默认缓存策略几乎总是最好的选择,而不是实现自己的缓存或更改请求的缓存策略。当服务器响应HTTP请求时,响应包括关于响应将有效的时间和条件的信息。例如,响应可能包含如下标题:
Cache-control: max-age:3600这是服务器告诉客户端,所提供的响应将在3600秒内良好。NSURLRequestUseProtocolCachePolicy理解这些值以及控制它们在客户端上使用的规则。如果您在3600秒内从客户端发出相同的请求,则Foundation将为应用程序提供缓存的响应,而不是与服务器联系。服务器“拥有”客户端请求的数据,是唯一能够正确推理响应有效性的方。
因此,假设用户在我们的示例中的3600秒内处于“脱机”状态。如果他们提出同样的请求,应用程序将使用缓存的响应。如果3600秒周期已经过去,则上下文将过期并无效。服务器已经告诉客户端,如果3600秒已经过去,它不应该使用这个响应。如果客户端“离线”,客户端将无法联系服务器或使用缓存-这正是您想要的。如果响应应该“永远”改变,客户端可以缓存并永久保存,那么服务器就会指出这一点(在这种情况下,可能是通过发送响应中的最大年龄值年数)。
https://stackoverflow.com/questions/25793572
复制相似问题