为什么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);
}];
答案 0 :(得分:0)
此时nil
有三个原因:
NSURLCache
中的唯一方法是明确添加它。NSURLCache
使用URL作为查找键。因为URL不能(不能)包含POST主体,所以对于不同的POST请求,将返回对同一URL的任何POST操作,这几乎肯定不是您想要的。因此,如果您确实添加了它,则必须在进入缓存和自定义查找代码的过程中添加一些URL的自定义重写,以根据特定的POST正文字段或其他内容使URL足够独特。这不一定是一整套理由。 : - )
缓存旨在减少网络流量。你一般不应该自己咨询。 NSURLSession
等使用的正常查找路径执行某些协议缓存策略(例如响应到期)的检查,这些策略仅通过询问缓存是否具有对特定密钥的响应而不会执行。
如果您需要一个通用机制来存储单个响应供应用程序以后使用(而不是将其保存在内存中),您应该在自己的内部字典中执行此操作(或者,如果响应很大,则使用下载任务并将文件移动到应用程序沙箱中的每个启动时清除的临时文件夹中。