我正在尝试诊断一个非常严重的错误,导致错误的图像被下载并缓存在我的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。
时间安排如下:
客户端现在错误地在两个位置显示相同的图像。
以下是我收到来自其他请求的数据回调didReceiveResponse
时堆栈的样子的截图:
我已确认[self.connection start]
的代表在didReceiveResponse
时间与代理人匹配,并且NSURLRequest
在开始和接收响应时间也匹配。
我唯一能想到的是NSURLConnection库中存在某种腐败现象。虽然我意识到NSURLSession是新的Apple认可的库,但我正在深入调试SDWebImage的内部(字面意思是SDWebImageDownloaderOperation),并且无法替换此库或使用NSURLConnection。
在过去的18个月里,这个问题已经定期出现问题,但是今天我能够在几秒钟内在我的旧版/慢速测试设备(iPhone 4S)上点击我的本地测试服务器。
任何人都可以解释我的情况NSURLConnection随机提供对不同连接的响应吗?
答案 0 :(得分:0)
可能是连接太多,限制了这个问题_downloadQueue.maxConcurrentOperationCount = 6;