Ios 奇怪的连接缓存行为
我有一个简单的方法,可以获取url并从服务器加载它:Ios 奇怪的连接缓存行为,ios,objective-c,nsurlconnection,nsurlrequest,nsurlcache,Ios,Objective C,Nsurlconnection,Nsurlrequest,Nsurlcache,我有一个简单的方法,可以获取url并从服务器加载它: - (void)loadURL:(NSString*)url { NSMutableURLRequest* request = [[NSMutableURLRequest alloc] init]; request.HTTPMethod = @"GET"; request.URL = [NSURL URLWithString:url]; NSHTTPURLResponse* response; [NS
- (void)loadURL:(NSString*)url
{
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] init];
request.HTTPMethod = @"GET";
request.URL = [NSURL URLWithString:url];
NSHTTPURLResponse* response;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
}
服务器返回的响应最长期限为1天
问题是,当我重复运行这3行时,其中2行会随机丢失缓存并重新加载响应:
[self loadURL:@"http://192.168.0.105:8080/users/51bdbc73808897302f000001/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09RoyipmXgcENwfE6EV9yzvgp5VTSZww"];
[self loadURL:@"http://192.168.0.105:8080/users/51ee9d4e263d08fe04000003/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09RoyipmXgcENwfE6EV9yzvgp5VTSZww"];
[self loadURL:@"http://192.168.0.105:8080/users/51d17b81de38c60b20000006/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09RoyipmXgcENwfE6EV9yzvgp5VTSZww"];
如果我向每个请求的查询字符串中添加一些随机唯一数据(&x、&y、&z),它将修复问题:
[self loadURL:@"http://192.168.0.105:8080/users/51bdbc73808897302f000001/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09RoyipmXgcENwfE6EV9yzvgp5VTSZww&x"];
[self loadURL:@"http://192.168.0.105:8080/users/51ee9d4e263d08fe04000003/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09RoyipmXgcENwfE6EV9yzvgp5VTSZww&y"];
[self loadURL:@"http://192.168.0.105:8080/users/51d17b81de38c60b20000006/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09RoyipmXgcENwfE6EV9yzvgp5VTSZww&z"];
此外,如果我将查询字符串的长度减少到80个字符,也可以解决问题:
[self loadURL:@"http://192.168.0.105:8080/users/51bdbc73808897302f000001/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09Royipm"];
[self loadURL:@"http://192.168.0.105:8080/users/51ee9d4e263d08fe04000003/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09Royipm"];
[self loadURL:@"http://192.168.0.105:8080/users/51d17b81de38c60b20000006/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09Royipm"];
发生什么事了?
这是iOS中的一个bug吗?我怎样才能修好它
注:我已经在iOS 5和iOS 6上的一个空应用程序中进行了测试,没有额外的内容。使用
requestWithURL:cachePolicy:timeoutInterval:
在NSURLRequest
中设置缓存行为。尝试:
- (void)loadURL:(NSString*)url
{
NSURL *url = [NSURL URLWithString:url];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy: NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10.0];
NSHTTPURLResponse* response;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
}
也可能使用
nsurlRequestReloadIgnoringLocal和RemoteCacheData
作为cachePolicy
您可能需要使用AsitpRequest
如何验证URL加载系统是从缓存读取还是访问远程服务器?请求中设置了哪些缓存控制头?客户端是否使用缓存?请注意,缓存可能会忽略服务器指定的过期时间。@CouchDeveloper我运行'tail-f server.log | grep avatar'来实时查看请求。服务器将缓存控制标头的值设置为“max age=86400”。并且客户端已设置NSURLCache。您需要检查请求中的缓存控制头。如前所述,客户端可以忽略服务器或代理设置的过期日期。缓存相当复杂:您可能还会在服务器日志中看到“缓存验证”,其状态代码通常为304,没有实体正文。@CouchDeveloper请求中没有与缓存相关的标头。我知道缓存的复杂性,但我需要知道为什么NSURLConnection的行为会根据url发生变化。这会改变缓存策略,因为它会绕过它,但不会解释为什么缓存有时在应该使用的时候不被使用。