NSURLConnection didReceiveResponse错误连接

时间:2015-09-23 20:54:16

标签: ios nsurlconnection sdwebimage

我正在尝试诊断一个非常严重的错误,导致错误的图像被下载并缓存在我的iOS客户端中,用于给定的URL。我下载了缩略图图像网格,在某些情况下,网格单元格会出现错误的缩略图图像。我使用流行的图像框架SDWebImage来管理我的所有图像下载,缓存等。以下代码片段来自SDWebImage库。

我看到回调

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

包含的响应不是我请求的URL,而是包含不同的URL。我知道这是因为在我(本地)服务器的请求标头中,我在请求标头中嵌入了文件名和ETag。我编写了以下代码以确保请求和响应匹配:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSString *etag = ((NSHTTPURLResponse *)response).allHeaderFields[@"ETag"];
    NSString *s3FileName = ((NSHTTPURLResponse *)response).allHeaderFields[@"file_name"];
    assert([self.request.URL.absoluteString rangeOfString:s3FileName].location != NSNotFound);

    // proceed with processing
}

该断言现在失败,这意味着响应对象中的文件名与请求中的文件名不匹配。

我也检查过NSURLCache中是否有错误,所以我这样做了:

NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:self.request];
NSLog(@"Cached response for %@ is %@", [self.request.URL absoluteString], cachedResponse);

缓存的响应始终为null。

在服务器上,我可以看到客户端在接收到对didReceiveResponse的调用之前从未请求过URL。

时间安排如下:

  • 客户请求http://localhost/1.jpg
  • 客户请求http://localhost/2.jpg
  • 服务器响应1.jpg
  • 的请求
  • didReceiveResponse被调用对应于2.jpg的请求,但是有1.jpg的数据。腐败
  • didReceiveResponse被调用对应于1.jpg的请求,其数据为1.jpg。

客户端现在错误地在两个位置显示相同的图像。

以下是我收到来自其他请求的数据回调didReceiveResponse时堆栈的样子的截图:

enter image description here

我已确认[self.connection start]的代表在didReceiveResponse时间与代理人匹配,并且NSURLRequest在开始和接收响应时间也匹配。

我唯一能想到的是NSURLConnection库中存在某种腐败现象。虽然我意识到NSURLSession是新的Apple认可的库,但我正在深入调试SDWebImage的内部(字面意思是SDWebImageDownloaderOperation),并且无法替换此库或使用NSURLConnection。

在过去的18个月里,这个问题已经定期出现问题,但是今天我能够在几秒钟内在我的旧版/慢速测试设备(iPhone 4S)上点击我的本地测试服务器。

任何人都可以解释我的情况NSURLConnection随机提供对不同连接的响应吗?

1 个答案:

答案 0 :(得分:0)

可能是连接太多,限制了这个问题_downloadQueue.maxConcurrentOperationCount = 6;