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。