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
等人使用的正常查找路径对某些协议缓存策略(例如响应过期)执行检查,这些策略仅通过询问缓存是否对特定键有响应是无法执行的。
如果您需要一种通用机制来存储单个响应供您的应用稍后使用(而不是将其保存在内存中),您应该在您自己的内部字典中这样做(或者,如果响应很大,通过使用下载任务并将文件移动到应用程序沙箱中的临时文件夹中,每次启动时都会清除该文件夹)。
为什么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
等人使用的正常查找路径对某些协议缓存策略(例如响应过期)执行检查,这些策略仅通过询问缓存是否对特定键有响应是无法执行的。
如果您需要一种通用机制来存储单个响应供您的应用稍后使用(而不是将其保存在内存中),您应该在您自己的内部字典中这样做(或者,如果响应很大,通过使用下载任务并将文件移动到应用程序沙箱中的临时文件夹中,每次启动时都会清除该文件夹)。