メイン キューのブロックを同期的にディスパッチする必要があります。現在メインスレッドで実行しているかどうかはわかりません。素朴な解決策は次のようになります。
dispatch_sync(dispatch_get_main_queue(), block);
しかし、現在メイン キューで実行されているブロック内にいる場合、この呼び出しによってデッドロックが発生します。(同期ディスパッチはブロックが終了するのを待ちますが、現在のブロックが終了するのを待っているため、ブロックは実行を開始しません。)
明らかな次のステップは、現在のキューを確認することです。
if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
block();
} else {
dispatch_sync(dispatch_get_main_queue(), block);
}
これは機能しますが、醜いです。少なくともカスタム関数の背後に隠す前に、この問題のより良い解決策はありませんか? ブロックを非同期にディスパッチする余裕がないことを強調します。アプリは、非同期にディスパッチされたブロックの実行が「遅すぎる」状況にあります。