我正在使用此代码从服务器提取简单的JSON提要:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager GET:kDataUrl parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"response: %@", responseObject);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"JSON DataError: %@", error);
}];
有效。但是,在我更改kDataUrl上的JSON文件并验证是否在浏览器中进行了更改后,当我再次运行应用程序时,我仍然得到之前的响应。
似乎AFNetworking以某种方式缓存了旧的响应。我不想要这种行为。我想下载当前的Feed。是否需要设置某种设置或参数来关闭缓存?
答案 0 :(得分:57)
简而言之,只需定义您的AFNetworking经理:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
享受!
答案 1 :(得分:12)
您遇到的是网址缓存的效果(请参阅NSURLCache)。
可以通过为NSMutableURLRequest
对象设置“缓存策略”来定义请求的缓存行为,例如:
NSMutableURLRequest* request = ...;
[request setCachePolicy: myCachePolicy];
默认缓存行为(NSURLRequestUseProtocolCachePolicy
)适用于当前协议,即HTTP。对于HTTP协议,默认情况下将缓存GET请求!
并且,AFNetworking不会更改请求的默认行为!
现在,您可以设置另一个缓存策略,例如:
NSURLRequestReloadIgnoringLocalCacheData
指定应从原始源加载URL加载的数据。不应使用现有的缓存数据来满足URL加载请求。
这可能是您想要实现的理想行为:
[request setCachePolicy: NSURLRequestReloadIgnoringLocalCacheData];
这里的问题是,超级“方便”的API没有提供配置请求的URL缓存行为的方法。您根本无法访问使用过的请求。
因此,我建议您使用较低级别的API来控制已创建的NSMutableURLRequest
对象,并相应地设置缓存策略。
答案 2 :(得分:1)
只是做:
manager.requestSerializer.cachePolicy = NSURLRequestCachePolicyReturnCacheDataElseLoad
答案 3 :(得分:1)
对于斯威夫特人来说
let manager = AFHTTPSessionManager()
manager.requestSerializer.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData
答案 4 :(得分:1)
尝试在网址末尾添加一些垃圾(例如,时间戳)
kDataUrl = [NSString stringWithFormat:@"%@?%f", kDataUrl, [NSDate timeIntervalSinceReferenceDate]];
在这种情况下,您每次都会请求新数据。 这对我有用))
答案 5 :(得分:0)
我感觉不太好,但这是有效的。在AppDelegate中,didFinishLaunchingWithOptions:
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
diskCapacity:0
diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
答案 6 :(得分:0)
使用AFNetworking 3:
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL
sessionConfiguration:sessionConfiguration];
答案 7 :(得分:0)
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
假设您的服务器正确实现,将Cache-Control:no-store
标头添加到请求中将返回具有相同标头的响应,从而为包含此标头的任何请求禁用NSURLCache
磁盘缓存。