gpt4 book ai didi

ios - NSURLCache 无视最大年龄

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:34:34 35 4
gpt4 key购买 nike

我正在使用以下代码从 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-revalidatemax-age 结合使用,或者 iOS 处理 must-revalidate< 的方式不正确?

有没有办法拦截响应以便我可以删除 must-revalidate? NSURLProtocol 似乎很有用,但我只能看到如何修改请求,而不是响应。

最佳答案

如果你使用NSURLProtocol,你可以发出一个新的请求(一定要打上标签,这样你就不会第二次修改),然后在响应上,你可以在旧的基础上创建一个新的响应对象一,并将修改后的响应发送给客户端。我不确定这是否足以解决您的问题。

然而,一个更好的(读作“实现起来更直接”)的解决方案可能是将 NSURLCache 对象子类化,并将您的自定义子类用作共享缓存(用于 NSURLConnection 和 NSURLSession 共享 session )或用作每个 session 缓存(用于其他 NSURLSession session )。

关于ios - NSURLCache 无视最大年龄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33601442/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com