NSURLCache cachedresponseforrequest 无数据

NSURLCache cachedresponseforrequest no data

为什么responseCache 为零?我会 运行 这个 post 并真正从缓存中获取 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);
}];

当时 nil 的三个原因:

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

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

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

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