AFNetworking - 不缓存响应

时间:2013-11-23 18:26:58

标签: ios json caching afnetworking afnetworking-2

我正在使用此代码从服务器提取简单的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。是否需要设置某种设置或参数来关闭缓存?

8 个答案:

答案 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磁盘缓存。