我試圖診斷一個非常嚴重的錯誤,導致錯誤的圖像被下載並緩存在我的iOS客戶端中給定的URL。我下載了一個縮略圖圖像的網格,並且在某些情況下,網格單元格會顯示錯誤的縮略圖圖像。我使用流行的圖像框架SDWebImage來管理我的所有圖像下載,緩存等。以下代碼片段來自SDWebImage庫。NSURLConnection didReceiveResponse對於錯誤的連接
我看到一個回調
- (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);
緩存的響應總是空。
在服務器上,我可以看到客戶端從未實際上在收到didReceiveResponse調用之前請求URL。
的時序如下:
- 客戶端請求http://localhost/1.jpg
- 客戶端請求http://localhost/2.jpg
- 服務器響應於1.JPG
- didReceiveResponse請求被稱爲對應於2.JPG請求,但與1.jpg的數據。腐敗
- didReceiveResponse被請求對應於1.jpg的請求,數據爲1.jpg。
客戶端現在錯誤地在兩個位置顯示相同的圖像。
這裏是什麼樣的堆棧看起來就像當時我收到回調didReceiveResponse
數據來自不同的請求截圖:
我已經證實,在[self.connection start]
委託匹配代表didReceiveResponse
時間,並且NSURLRequest
也匹配在開始和接收響應時間。
我唯一能想到的是在NSURLConnection庫中存在某種腐敗。雖然我意識到NSURLSession是蘋果認可的新庫,但我正在深入調試SDWebImage的內部(字面意思是SDWebImageDownloaderOperation),而且我無法替換這個庫或使用NSURLConnection。
在過去的18個月裏,這個問題已經被定期清除,但是今天我能夠在幾秒鐘內每次在我的老/慢測試設備之一,iPhone 4S上點擊我的本地測試服務器。
任何人都可以解釋我的情況,NSURLConnection隨機提供響應到不同的連接?
我曾經有過這個確切的問題,它竟然是我的服務器的負載均衡的問題 - 它被髮送到錯誤的連接反應。 NSURLConnection經過戰鬥測試和可靠;我懷疑這是罪魁禍首。 –
Hace你檢查了你的測試服務器是否支持http流水線?有關此問題的任何更新? – pdrcabrod