2015-09-23 30 views
1

我試圖診斷一個非常嚴重的錯誤,導致錯誤的圖像被下載並緩存在我的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數據來自不同的請求截圖:

enter image description here

我已經證實,在[self.connection start]委託匹配代表didReceiveResponse時間,並且NSURLRequest也匹配在開始和接收響應時間。

我唯一能想到的是在NSURLConnection庫中存在某種腐敗。雖然我意識到NSURLSession是蘋果認可的新庫,但我正在深入調試SDWebImage的內部(字面意思是SDWebImageDownloaderOperation),而且我無法替換這個庫或使用NSURLConnection。

在過去的18個月裏,這個問題已經被定期清除,但是今天我能夠在幾秒鐘內每次在我的老/慢測試設備之一,iPhone 4S上點擊我的本地測試服務器。

任何人都可以解釋我的情況,NSURLConnection隨機提供響應到不同的連接?

+0

我曾經有過這個確切的問題,它竟然是我的服務器的負載均衡的問題 - 它被髮送到錯誤的連接反應。 NSURLConnection經過戰鬥測試和可靠;我懷疑這是罪魁禍首。 –

+0

Hace你檢查了你的測試服務器是否支持http流水線?有關此問題的任何更新? – pdrcabrod

回答

0

可能有太多的聯繫,限制quneue,_downloadQueue.maxConcurrentOperationCount = 6;

相關問題