AFNetworking – 不要caching响应

我正在使用这段代码从服务器中获取一个简单的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文件并validation更改是在浏览器中进行后,当我再次运行该应用程序时,仍然得到以前的响应。

AFNetworking似乎caching了旧的回应。 我不想要这种行为。 我想下载当前的饲料。 是否有某种设置或参数需要设置为closurescaching?

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

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

请享用!

您所遇到的是URLcaching的效果(请参阅NSURLCache )。

请求的caching行为可以通过设置NSMutableURLRequest对象的“caching策略”来定义,例如:

 NSMutableURLRequest* request = ...; [request setCachePolicy: myCachePolicy]; 

默认caching行为( NSURLRequestUseProtocolCachePolicy )适用于当前协议,即HTTP。 而对于HTTP协议,GET请求将被默认caching!

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

现在,您可以设置另一个caching策略,例如:

NSURLRequestReloadIgnoringLocalCacheData

指定应该从原始源加载URL加载的数据。 不应该使用现有的caching数据来满足URL加载请求。

这可能是你想达到的理想行为:

 [request setCachePolicy: NSURLRequestReloadIgnoringLocalCacheData]; 

这里的问题是,超级“方便”的API不提供configuration请求的URLcaching行为的方式。 根本无法访问使用的请求。

因此,我build议使用较低级别的API来控制创build的NSMutableURLRequest对象,并相应地设置高速caching策略。

做就是了:

 manager.requestSerializer.cachePolicy = NSURLRequestCachePolicyReturnCacheDataElseLoad 

尝试在url末尾添加一些垃圾(例如时间戳)

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

在这种情况下,您每次都会要求新的数据。 这对我行得通))

我不觉得好,​​但这是有效的。 在AppDelegate didFinishLaunchingWithOptions中:

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

对于Swift的人来说

 let manager = AFHTTPSessionManager() manager.requestSerializer.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

与AFNetworking 3:

 NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; sessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL sessionConfiguration:sessionConfiguration]; 
 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager.requestSerializer setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"]; [manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 

Cache-Control:no-store头添加到请求(假定您的服务器已正确实现),将返回具有相同头的响应,从而为包含此头的任何请求禁用NSURLCache磁盘caching。