AFNetworking - 不要缓存响应

17

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


你解决了吗?我找不到在AFHTTPRequestOperationManager中设置缓存策略的东西。 - laucel
在这篇博客文章中,我介绍了AFNetworking中的缓存 - AFImageCache和NSURLCache。也许你会觉得它很有用:http://blog.originate.com/blog/2014/02/20/afimagecache-vs-nsurlcache/ - vfxdrummer
请尝试像这样操作: https://dev59.com/_pHea4cB1Zd3GeqPly9F#33886449 - Vvk
8个回答

61

长话短说,只需定义您的AFNetworking管理器:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

享受吧!


1
AFNetworking 中没有名为 setCachePolicy 的方法。您能否请更明确一些? - Aswin Sathyan
2
使用新的AFNetworking库版本,您可以将其设置为URL会话配置对象。NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; - dishan

12
你所经历的是URL缓存的影响(请参见NSURLCache)。可以通过为NSMutableURLRequest对象设置“缓存策略”来定义请求的缓存行为,例如:
NSMutableURLRequest* request = ...;
[request setCachePolicy: myCachePolicy];

默认缓存行为(NSURLRequestUseProtocolCachePolicy)适用于当前的协议,即HTTP协议。对于HTTP协议,默认情况下会缓存GET请求!

而且,AFNetworking不会改变请求的默认行为!

现在,您可以设置另一种缓存策略,例如:

NSURLRequestReloadIgnoringLocalCacheData

指定应从源加载URL加载的数据,不应使用任何现有的缓存数据来满足URL加载请求。

这很可能是您想要实现的预期行为:

[request setCachePolicy: NSURLRequestReloadIgnoringLocalCacheData];

问题在于,这个超级“方便”的API没有提供一种配置请求URL缓存行为的方式。您根本无法访问所使用的请求。

因此,我建议使用更低级别的API,您可以控制创建的NSMutableURLRequest对象,并相应地设置缓存策略。


1
对于熟悉Swift的人
let manager = AFHTTPSessionManager()
manager.requestSerializer.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

1

只要做:

manager.requestSerializer.cachePolicy = NSURLRequestCachePolicyReturnCacheDataElseLoad

1
使用AFNetworking 3:
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL
                                                         sessionConfiguration:sessionConfiguration];

1
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

向请求添加 Cache-Control:no-store 头,假设您的服务器已正确实现,则会返回带有相同头的响应,从而禁用包含此头的任何请求的 NSURLCache 磁盘缓存。

1

尝试在您的URL末尾添加一些垃圾(例如,时间戳)

kDataUrl = [NSString stringWithFormat:@"%@?%f", kDataUrl, [NSDate timeIntervalSinceReferenceDate]];

在这种情况下,您每次都需要请求新数据。 对我来说没问题))

0

我对此感觉不太好,但这是有效的方法。在AppDelegate didFinishLaunchingWithOptions中:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
                                                            diskCapacity:0
                                                                diskPath:nil];
    [NSURLCache setSharedURLCache:sharedCache];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接