ブロックをメインキューに同期してディスパッチする必要があります。私は現在メインスレッドかノーで実行しているかわかりません。純粋な解決策は次のようになります。デッドロックなしでメインキューに同期してディスパッチする方法はありますか?
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);
}
これは機能しますが、醜いです。私は少なくともいくつかのカスタム関数の背後にそれを隠す前に、この問題の良い解決策はありませんか?ブロックを非同期でディスパッチする余裕がないことを強調します。アプリは、非同期的にディスパッチされたブロックが「遅すぎる」実行される状況にあります。
私はそれはかなり良い解決策だと思います。あなたが行うことができるのは、あらかじめ定義されたマクロとして作成することです。そのため、コードはあまりにも醜く見えません。 –
これは多かれ少なかれ「テキストブック」の解決策です。 –