iOSアプリで最も奇妙な動作を見つけました。私はこのコードを持っています:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
CMLog(@"Start Save RoundQuestions Asynchronously");
[round saveRoundQuestions:target selector:selector];
});
その関数は作業を終了し、これを呼び出します。
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[target performSelector:selector];
#pragma clang diagnostic pop
ログにはすべてが正しく実行されていることが示されていますが、ターゲットはnavigationControllerでpushViewControllerを呼び出しており、実際のプッシュを実行するには永遠に時間がかかります。ホームボタンをクリックすると、強制的に続行できます。スレッドセーフに違反している可能性があり、実行ループをスリープ解除する必要がある可能性があることを読みました。
dispatch_asyncからセレクターを呼び出すのは間違っていますか?または、UIがあるメインスレッドでセレクターを実行する必要がありますか?
編集:私は実際に問題を理解しました。私は、saveRoundQuestions内のUIをブロックしている関数を呼び出していたことがわかりました。これは、いわば、プッシュアニメーションを行の後ろに強制していると思います。この関数をバックグラウンドに置くと、プッシュアニメーションがすぐに実行されます。しかし、私はまだ理由について興味がありますか?