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を介して実際にリクエストが送信されていないことを確認しました。このタイプの動作の原因は何ですか?