dispatch_asyncを使用していくつかの問題が発生しています。アプリケーションのメイン/ UIスレッドでは、グローバルキューのdispatch_asyncを呼び出し、完了ハンドラを持つ関数呼び出しを行うように指示します。補完ハンドラが呼び出されると期待していますが、時には表示されません。runloopがdispatch_asyncからイベントを処理しない
dispatch_queue_t hiq = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(hiq, ^(void){
[object doSomethingAndThenCompletionHandler:^(){
//Do some stuff because I'm done
}];
});
興味深いことに、私は何かをテキストフィールドに入力するたびにcontrolTextDidChangeに応答してこれを行います。 テキストフィールドをクリックすると、すべての完了ハンドラが一度に起動します。
私の推測では、すべてのコンプリートハンドラが実行ループ上にキューイングされていて、UI要素がフォーカスを失ったときにキューが解放されると思います。テキストフィールドやコンボボックスに入力しているときに正確に何が起きているのかを知るためには、実行ループの専門家では不十分ですが、おそらく実行ループを縛っていますか?
EDIT:実行ループモードを印刷すると、完了ハンドラを除いてヌルとして出力されるため、デフォルトモードとして印刷されるため、実行ループモードと関係があると思います。私はコンボボックスを使用していますが、この問題はコンボボックスが開いて展開されている場合にのみ表示されます。 UIScrollView blocks run loop?私はそれがこの問題と関係があるかもしれないと思います。皆さんはどう思いますか?
'dispatch_async'を動作させるためには、実行ループを心配する必要はありません。完了ハンドラで何をしていますか? –
これは動作するかどうかをテストするためのプリント文です。また、他のUIトリガーの影響を受けているようだ。テキストフィールドに1文字または2文字を入力してから、テキストフィールドをクリックしてフォーカスを失った場合、すべての完了ハンドラが起動します。 – JPC
私は何かを達成しようとしていません。私はそれが機能するかどうかを調べるためにそれを入れたので、それがなければ働いていなかった。実験のためだけに実際にあります – JPC