Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 奇怪的连接缓存行为_Ios_Objective C_Nsurlconnection_Nsurlrequest_Nsurlcache - Fatal编程技术网

Ios 奇怪的连接缓存行为

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

我有一个简单的方法,可以获取url并从服务器加载它:

- (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发生变化。这会改变缓存策略,因为它会绕过它,但不会解释为什么缓存有时在应该使用的时候不被使用。