4

サーバーに(メソッドを介して)リクエストを送信するとすぐにNSURLConnection sendSynchronousRequest、サーバーは約2秒でそれを受信し、さらに3〜5秒で処理して応答を返します。ただし、30 ~ 35 秒でしか応答が返されません。この遅延により、通信が非常に遅くなります。

非同期 API でさえ応答が遅れています。

以前は、すべてが正常に機能しており、クライアントは 10 秒以内に応答を返していました。この問題を抱えている他の人はいますか?その理由は何ですか?

ここでの編集Wiresharkは、分析のスクリーンショットです。

より良い画像へのリンク

ここに画像の説明を入力

どのパケットが何を言っているのかを確認するにはどうすればよいですか?.そして、なぜ遅れているのですか?

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);
4

5 に答える 5

8

電話は避けたいsendSynchronousRequest。バックグラウンド スレッドでまだ呼び出しを行っていない場合 (UI スレッドをブロックしたくない場合) は、代わりに非同期バージョンを使用してください。

iOS 応答がいつ受信されたかをどのように知ることができますか? NSLog? UI 状態の変化?

次の質問も参照してください。

NSURLConnection sendSynchronousRequest - バックグラウンドからフォアグラウンドへ

NSURLConnection sendSynchronousRequest の応答に時間がかかりすぎる

アップデート

NSURLConnection少し行き詰まっている場合、1 つの戦略は、問題としての使用を除外することです。

  • 戦略 1:NSURL同期の代わりに の非同期接続呼び出しを使用してみてください
  • 戦略 2: AFNetworkingなどの別の HTTP ライブラリを使用してみる

HTTP 接続で何が起こっているかを詳しく調べたい場合は、CharlesFiddlerWiresharkなどのツールを使用して、送受信されているデータをデバッグできます。この種の分析を最大限に活用するには、HTTP プロトコルに関する知識が必要です。これはおそらく、前述の戦略よりも時間がかかります。

iOS シミュレーターから行われたネットワーク呼び出しを監視する方法などの質問も参照してください。

アップデート

あなた自身のウェブサーバーにアクセスしていますか、それとも他の誰かのウェブサーバーですか?

Web サーバーに送信されるヘッダー (および返されるヘッダー) を詳しく調べましたか? たとえば、コンテンツの長さに注意してください。こちら で説明されているように、コンテンツの長さが間違っていると、遅延が発生する可能性があります。

リクエストと返されたヘッダーを表示するには、コマンド ラインで Firebug や wget や curl などを使用できます。

また、ここで説明されているように、URL の末尾に改行がないことを再確認してください。

于 2013-01-18T11:40:29.830 に答える
4

私のために働いた解決策:

リクエスト ヘッダーでは、iOS はデフォルトで「Accept-Encoding」に「gzip」を設定します。gzip 圧縮に時間がかかっていたため、応答が遅れていました。問題を解決するために次のことを行いました。

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

注: 応答の遅延がないか、ヘッダーを確認してください。

リクエスト ヘッダーに誘導してくれた @occulus に感謝します。

于 2013-01-29T09:04:15.633 に答える
0

あなたはこれをwifiまたはcelluarで行いますか?

私の経験から言えば、データ使用量が超過すると、電話プロバイダーがダウンロードを遅くします。これは、モバイル データを大量に使用した後の月末に発生することがあります。

于 2013-01-18T11:40:54.697 に答える
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!");
于 2013-01-28T10:06:15.433 に答える
-1

非同期 HTTP リクエストの問題を軽減するには、AFNetworking フレームワークの使用を検討する必要があります。

于 2013-01-29T12:53:20.053 に答える