UI がメイン ループで実行されている間、メイン実行ループでは実行されない非同期タスクが非同期で実行されます。Concurrency Programming Guideをご覧ください。
したがって、ここであなたの場合、同期時間がどれくらいかかるかはよくわかりません。10秒かかるかもしれないと仮定していますが、完全にはわかりません。したがって、この場合、ブロックを操作するか、メイン スレッドで非同期タスクが完了したときに asyncTaskFinished 関数をトリガーする方法を見つける必要があります。単純なブロック コールバックを定義し、非同期タスクが終了したときに関数をトリガーすることができます。
非同期タスクに GCD を使用すると、非常に簡単になります。あなたはこれだけのことをするでしょう。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self runMyAsyncTask];
// trigger the main completion handler when this completed
dispatch_async(dispatch_get_main_queue(), ^{
[self asyncTaskFinished];
});
});
同時実行に NSThread を使用する場合、 performSelector:onThread: を使用して、非同期タスクが終了したときに完了セレクターをトリガーできます。簡単なケースとして、コールバック ハンドラを実装する方法を示します。このような関数を作成して、非同期タスクをトリガーすることができます。
-(void)launchAsyncTaskWithCompletionHandler:(void(^)(void))completionHandler{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self runMyAsyncTask];
// trigger the main completion handler when this completed
dispatch_async(dispatch_get_main_queue(), ^{
completionHandler();
});
});
}
これを呼び出すのは比較的簡単です。
[self launchAsyncTaskWithCompletionHandler:^{
[self asyncTaskFinished];
}];
これは理解しやすく、コードをより明確にします。これがお役に立てば幸いです。