2013-01-18 94 views
4

一旦我向服務器發送請求(通過NSURLConnectionsendSynchronousRequest方法),服務器在大約2秒鐘內收到它,它會在3-5秒內處理併發迴響應。但是,我只能在30-35秒內收回迴應。這種延遲使我們的溝通非常緩慢。iphone延遲服務器響應

即使異步API獲得延遲響應。

此前,一切工作正常,客戶端在10秒內獲得響應。 其他人有這個問題?可能是什麼原因?

編輯 這裏是Wireshark分析的截圖:

Link以更好的形象

enter image description here

我應該如何看什麼包說什麼..爲什麼它延遲?

EDIT2 下面是代碼:

NSHTTPURLResponse *response=nil; 

NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:nsURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:180.0]; 
[theRequest setHTTPMethod:@"POST"]; 
[theRequest setTimeoutInterval:180.0]; 
[theRequest setHTTPBody:[[NSString stringWithFormat:@"%@",sdata] dataUsingEncoding:NSASCIIStringEncoding]]; 

NSError *error= nil; 

NSData *result = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&response error:&error]; 
if (error) { 
    NSLog(@"error sending synchronous request: %@", error); 
} 
NSLog(@"request completed with code:%d",response.statusCode); 
+0

將代碼爲更好地瞭解 – iPatel

+0

@iPatel:看到編輯 –

+1

檢查網絡......可能是網絡烏爾issueee – iPatel

回答

4

解決方案爲我工作:

在請求標頭中,默認情況下,iOS爲「Accept-Encoding」設置「gzip」。 gzip壓縮花費了大量時間,因此延遲了響應。我做了以下來解決問題:

[theRequest setValue:@"" forHTTPHeaderField:@"Accept-Encoding"]; 

注意:檢查您的標題,任何響應延遲。

感謝@occulus引導我到請求標題!

+0

一個快速的問題,這是否意味着gzip壓縮僅在請求不響應時被移除?我相信如此,但想得到證實:) – trillions

+0

沒有。在請求頭中設置這個參數可以確保在整個連接中沒有gzip壓縮(即使在響應中也沒有)。 –

+0

如果反應很大,那該怎麼辦?請問您的案件的平均回覆大小? :)我可能會遇到同樣的問題,所以我想更好地瞭解如何在頭文件中設置它的決定。 – trillions

8

我想避免調用sendSynchronousRequest。如果您沒有在後臺線程上執行調用(您不想阻止UI線程),請改用異步版本。

您如何知道何時收到iOS響應? NSLog? UI狀態更改?

參見下列問題:

NSURLConnection sendSynchronousRequest - background to foreground

NSURLConnection sendSynchronousRequest taking too much time to respond

更新

如果你有點卡住,一個策略可能是排除使用NSURLConnection作爲問題。

  • 策略1:嘗試使用NSURL的臺異步連接呼叫,而不是同步
  • 策略2:嘗試使用不同的HTTP lib下,如AFNetworking

如果你想仔細看看HTTP連接正在發生什麼,可以使用諸如Charles,FiddlerWireshark之類的工具來調試正在發送和接收的數據。爲了從這種分析中獲得最大收益,您需要了解HTTP協議的一些知識。這可能比前面提到的策略耗費更多時間。

另請參見How to monitor network calls made from iOS Simulator等問題。

更新

你訪問你自己的Web服務器,或者是別人的?

你有沒有仔細看看發送到你的網絡服務器(和正在返回的)的標題?例如,請注意內容的長度。錯誤的內容長度會導致延遲,如here所解釋的。

要查看請求和返回的標頭,可以在命令行上使用Firebug或類似wget或curl的東西。

此外,請仔細檢查您的網址末尾是否有換行符,如here所述。

+0

我是在執行'sendSynchronousRequest'之前執行NSLog,並在那之後執行。我在後臺線程中執行sendSynchronousRequest,所以我認爲它相當於異步版本。 –

+0

好的。如果您使用瀏覽器或wget/curl獲取相同的數據會發生什麼?可以嗎? – occulus

+0

更新了我的答案。 – occulus

0

你通過wifi或celluar做到這一點嗎?

根據我的經驗,當我的數據使用率被免除時,我的手機提供商會減慢我的下載速度。在我使用了大量移動數據之後,有時候這發生在本月底。

+0

其無線網絡無限制的數據使用計劃 –

0

我不確定要說但可能是網絡問題先檢查一下。它適當還是下降?不過也許我是錯的..但首先要檢查它...

下面介紹的代碼可能解決您的問題:)

NSString *url = @"Your URL "; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0]; 
[request setHTTPMethod:@"POST"]; 

NSMutableData *body = [NSMutableData data]; 
. 
. 

    /// Add Here Your NSMutableData Valuew 
. 
. 
[request setHTTPBody:body]; 
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
if (theConnection) 
{ 
    self.responseData = [[NSMutableData alloc] init]; 
} 
else 
    NSLog(@"Connection Failed!"); 
+0

網絡是我檢查的第一件事,網絡上沒有任何東西。將嘗試你的代碼 –

-1

爲了緩解異步HTTP請求你的問題,你應該考慮在這裏使用AFNetworking框架

+1

這根本不是真的,AFNetworking是基於NSURLCOnnection – Terminus