の完了ルーチンで
[NSURLConnection sendAsynchronousRequest:request
queue:queue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
呼んでいます
dispatch_async(dispatch_get_main_queue(), ^
{
NSLog(@"CALLING SUCCESS");
});
2 つのテスト アプリケーションがあります。1 つは正しく動作し、もう 1 つは正しく動作しません。何が起こるかというと、ログ ステートメントは実行されません。キューはで作成されました
queue = [[NSOperationQueue alloc] init];
私を夢中にさせて、それは単に実行をまったく拒否します。どちらの場合も、アプリケーションの起動中にこれを呼び出しました。電話を5秒遅らせてみました。私が何をしても、あるアプリではブロックを実行しませんが、他のアプリでは実行します。どのような状況でdispatch_async(dispatch_get_main_queue()...が失敗する可能性があるかについての手がかりがあれば、違いを見分けることができるかもしれません。
実際のコードでは、メイン スレッドで実行するブロックを呼び出していることに注意してください。テスト ケースを NSLog の呼び出しだけに減らしました。
更新: 違いは、このコードは iOS 5.1 シミュレーターでは機能しませんが、6.0 または 6.1 では機能することです。なんで?
更新 2: OK、デフォルトの NSURLConnection を使用すると動作しますが、使用すると
self.connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
[self.connection setDelegateQueue:queue];
[self.connection start];
iOS 5.1 では動作しません。これは 5.1 の setDelegateQueue のバグではないかと考え始めています。