设置caching时间AFNetworking swift 2

我正在使用代码AFNetworking加载数据

let manager = AFHTTPRequestOperationManager() manager.requestSerializer.cachePolicy = NSURLRequestCachePolicy.ReturnCacheDataElseLoad manager.responseSerializer = AFHTTPResponseSerializer() let testUrl = "https://www.google.com/maps/vt/pb=!1m8!3m7!1m2!1u2816!2u5888!2m2!1u1536!2u512!3i6!2m3!1e0!2sm!3i333!2m20!1e2!2spsm!4m2!1sgid!2sWejnA6yw2AIgHrbvnAUOAg!4m2!1ssp!2s1!8m11!13m9!2sa!15b1!18m5!2b1!3b0!4b1!5b0!6b0!19b1!19u12!3m2!2sen!5e1105!4e4!11m2!1e2!2b1&authuser=0" manager.GET(testUrl, parameters: nil, success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in print("afnetworking GET success1") }, failure: { (operation: AFHTTPRequestOperation?,error: NSError!) in print("afnetworking GET 1 - Error: " + error.localizedDescription) }) 

当数据在高速caching,它给我从caching中的数据…它的罚款,
但我怎么能
1) – 设置caching策略,只caching1小时
2) – 当服务器没有caching头不caching时,对于这种情况也要caching数据一个小时。

对于来自Swift宗教的人,我用AFNetworking 3.0调用self.setDataTaskWillCacheResponseBlock:方法编写了AFHTTPSessionManager扩展,并修改了Cache-Control响应头值:

 extension AFHTTPSessionManager { //duration in seconds func forceCacheResponse(duration:Int) { self.setDataTaskWillCacheResponseBlock({ (session:NSURLSession, task:NSURLSessionDataTask, proposedResponse:NSCachedURLResponse) -> (NSCachedURLResponse) in if let response = proposedResponse.response as? NSHTTPURLResponse { var headers = response.allHeaderFields as! [String:String] headers["Cache-Control"] = String(format: "max-age=%@", arguments: [duration]) let modifiedResponse = NSHTTPURLResponse(URL: response.URL!, statusCode: response.statusCode, HTTPVersion: "1.1", headerFields: headers) if (modifiedResponse != nil) { let cachedResponse = NSCachedURLResponse(response: modifiedResponse!, data: proposedResponse.data, userInfo: proposedResponse.userInfo, storagePolicy: NSURLCacheStoragePolicy.Allowed) return cachedResponse } } return proposedResponse }) } } 

现在你有非常简单的用法:

 let manager = AFHTTPSessionManager() manager.forceCacheResponse(604800) 

你可以用setDataTaskWillCacheResponseBlock通过改变响应的头域来解决它。 您需要ExpiresExpires字段。

目标C中的示例:

 [manager setDataTaskWillCacheResponseBlock:^NSCachedURLResponse *(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse) { NSHTTPURLResponse *resp = (NSHTTPURLResponse*)proposedResponse.response; NSMutableDictionary *newHeaders = [[resp allHeaderFields] mutableCopy]; if (newHeaders[@"Cache-Control"] == nil) { newHeaders[@"Cache-Control"] = @"public"; } NSHTTPURLResponse *response2 = [[NSHTTPURLResponse alloc] initWithURL:resp.URL statusCode:resp.statusCode HTTPVersion:@"1.1" headerFields:newHeaders]; NSCachedURLResponse *cachedResponse2 = [[NSCachedURLResponse alloc] initWithResponse:response2 data:[proposedResponse data] userInfo:[proposedResponse userInfo] storagePolicy:NSURLCacheStorageAllowed]; return cachedResponse2; }];