1

NSURLConnectionを使用してGET経由でXMLをロードするiOS5アプリがあります。ごくまれに、接続が繰り返しタイムアウトする状態でスタックしているように見えることがあります。

リクエストの例:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:url]];
/*
The request is set with a timeout interval of 10 because (due to the nature of 
the app and the XML feed) this data is reloaded every 15 seconds.
*/
[request setTimeoutInterval:10];
[request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
[request setHTTPMethod:@"GET"];
self.afOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
self.afOperation.successCallbackQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
self.afOperation.failureCallbackQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
//snip success/completion block code
[self.afOperation start];

これまで、リクエストがハングし始めたときの3つの「リカバリ」シナリオを見てきました。

  • アプリ全体を終了します
  • デバイスをコンピューターに接続します(はい、本当に)。iPhone / iPadが接続を確認した直後に、すぐにタイムアウトが停止します。
  • アプリを終了して、しばらくの間他のことをしてください。通常、アプリをすばやく終了して再起動するだけでは、回復するには不十分です。

ご想像のとおり、これは非常に奇妙なことです。この時点で、私は自分のNSURLConnectionDelegate実装をAFNetworkingに置き換えました(上記のように)が、まだ同じ問題が発生しています。すべてのNSURLConnectionDelegateプロトコルセレクターにロギングを追加しましたが、(呼び出した後にstart)呼び出されるセレクターは。だけであることがわかりましたconnection:didFailWithError:。複数のリクエストを積み上げていないことを確認しました(以前のリクエストは常にキャンセルされ、新しいリクエストを開始する前に無効になります)。さらに、ルーターのtcpdumpを介して実際にリクエストが送信されていないことを確認しました。このタイプの動作の原因は何ですか?

4

2 に答える 2

1

testflight SDKをインストールした後、エラーが発生し始めました。それを削除すると、エラーを取り除くことができました。ただし、これはTestflightとASIHttpRequest(または使用するレストキット)間の相互作用が原因だと思います。以下のリンクにある次の解決策によっても解決できる可能性があります(ビルドフェーズでASIHttpRequestファイルとASIFormDataRequestファイルのコンパイラ最適化を無効にします)

https://groups.google.com/forum/?fromgroups#!topic/asihttprequest/fw7PDcD2wKI%5B1-25%5D

于 2012-08-09T03:24:00.710 に答える
1

この問題は、TestFlightSDKv1.0以下が原因であることが判明しました。NSURLConnectionがバックエンドに到達できないのはなぜですか?を参照してください。

彼らが修正をリリースするまで、SDKを完全に取り除く以外に問題を回避する方法はありません。

于 2012-04-28T03:34:47.037 に答える