NSURLCache cachedresponseforrequest没有数据

时间:2017-07-05 11:33:48

标签: nsurlcache

为什么responseCache是​​零?我运行这篇文章,真的从缓存中获取responseObject。我如何获得responseCache?

manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];

manager.requestSerializer.cachePolicy=NSURLRequestReturnCacheDataElseLoad;

[manager POST:URL parameters:paramdic progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

    NSData * data=[NSJSONSerialization dataWithJSONObject:responseObject options:NSJSONWritingPrettyPrinted error:nil];

    NSURLCache * cache=[NSURLCache sharedURLCache];

    NSCachedURLResponse * responseCache=[cache cachedResponseForRequest:task.originalRequest];

    NSCachedURLResponse * response=[[NSCachedURLResponse alloc]initWithResponse:task.response data:data userInfo:nil storagePolicy:NSURLCacheStorageAllowed];


    [cache storeCachedResponse:response forRequest:task.originalRequest];




} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    NSLog(@"%@",error);
}];

1 个答案:

答案 0 :(得分:0)

此时nil有三个原因:

  • 任何iOS / OS X网络代码都不会缓存POST请求,因为它们不能保证是幂等的(即它们可能有副作用,例如在服务器上存储数据)。 POST请求存储在NSURLCache中的唯一方法是明确添加它。
  • 不会缓存POST请求,因为NSURLCache使用URL作为查找键。因为URL不能(不能)包含POST主体,所以对于不同的POST请求,将返回对同一URL的任何POST操作,这几乎肯定不是您想要的。因此,如果您确实添加了它,则必须在进入缓存和自定义查找代码的过程中添加一些URL的自定义重写,以根据特定的POST正文字段或其他内容使URL足够独特。
  • 缓存是高度异步的,因此当请求的完成处理程序运行时,即使这是一个GET请求,缓存的数据也不一定可用。

这不一定是一整套理由。 : - )

缓存旨在减少网络流量。你一般不应该自己咨询。 NSURLSession等使用的正常查找路径执行某些协议缓存策略(例如响应到期)的检查,这些策略仅通过询问缓存是否具有对特定密钥的响应而不会执行。

如果您需要一个通用机制来存储单个响应供应用程序以后使用(而不是将其保存在内存中),您应该在自己的内部字典中执行此操作(或者,如果响应很大,则使用下载任务并将文件移动到应用程序沙箱中的每个启动时清除的临时文件夹中。