- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用以下代码从 TfL 下载一些数据。
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.tfl.gov.uk/StopPoint/490012211N/Arrivals"]];
[[session dataTaskWithRequest:req
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSLog(@"Loaded Succesfully");
}
NSCachedURLResponse *resp = [[NSURLCache sharedURLCache] cachedResponseForRequest:req];
if (resp) {
NSLog(@"Response in cache");
}
[[session dataTaskWithRequest:req
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSLog(@"Loaded Sucessfully again");
}
}] resume];
}] resume];
reponse的cache-control头字段是public, must-revalidate, max-age=5, s-maxage=10
这似乎意味着服务器会发送一个请求,即使第二次请求在 max-age 给出的 5 秒内。如果我使用 Charles 编辑响应并删除 must-revalidate,那么上面的代码只向服务器发送一次请求。
HTTP/1.1 规范说
that cache MUST NOT use the entry after it becomes stale to respond to a subsequent request without first revalidating it with the origin server.
对于 must-revalidate
,但是 iOS 似乎忽略了“在它变得陈旧之后”部分?并采用 must-revalidate
表示忽略最大年龄。那么与将字段设置为根本不缓存有何不同。我已经检查过请求/响应被添加到缓存中,所以看起来 must-revalidate
只是膨胀了缓存,因为它永远不会使用它,但仍然将它添加到缓存中?
服务器是否错误地将 must-revalidate
与 max-age
结合使用,或者 iOS 处理 must-revalidate< 的方式不正确
?
有没有办法拦截响应以便我可以删除 must-revalidate
? NSURLProtocol 似乎很有用,但我只能看到如何修改请求,而不是响应。
最佳答案
如果你使用NSURLProtocol,你可以发出一个新的请求(一定要打上标签,这样你就不会第二次修改),然后在响应上,你可以在旧的基础上创建一个新的响应对象一,并将修改后的响应发送给客户端。我不确定这是否足以解决您的问题。
然而,一个更好的(读作“实现起来更直接”)的解决方案可能是将 NSURLCache 对象子类化,并将您的自定义子类用作共享缓存(用于 NSURLConnection 和 NSURLSession 共享 session )或用作每个 session 缓存(用于其他 NSURLSession session )。
关于ios - NSURLCache 无视最大年龄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33601442/
我有一个带有“只读”函数的类,不应将其序列化为 JSON 对象。因为该函数的名称以“get”开头,Jackson 捕获了它,并且似乎不尊重附加的 @JsonIgnore 标签: import org.
示例 procmailrc: SHELL=/bin/bash LOGFILE=$HOME/procmail.log VERBOSE=yes :0 * ^Subject: envdump please$
我正在尝试“PhoneGap”(1.7.0) jQuery Mobile 应用程序 (1.1.0) 我必须创建一个 Android 应用程序。但是,我不断收到以下警告消息。 ERROR: Attemp
我是一名优秀的程序员,十分优秀!