1

dispatch_asyncの使用に問題があります。アプリケーションのメイン/UIスレッドで、グローバルキューで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要素がフォーカスを失うと、キューが解放されます。テキストフィールドまたはコンボボックスに入力しているときに何が起こっているのかを正確に知るには、実行ループの専門家ではありませんが、おそらく実行ループを拘束しているのでしょうか。

編集:実行ループモードを印刷すると、デフォルトモードとして出力する場合の完了ハンドラーを除いて、NULLとして出力されるため、実行ループモードと関係があると思います。コンボボックスを使用していますが、この問題は、コンボボックスを開いて展開した場合にのみ発生します。 UIScrollViewブロックはループを実行しますか? 私はそれがこの問題に関係しているかもしれないと思います。皆さんはどう思いますか?

4

2 に答える 2

1

を実行[[NSRunLoop currentRunLoop] runUntilDate:fiveSecondsFromNow]すると、実行ループに入り、実行ループは通常どおりイベントを処理します。したがって、テキストフィールドが別のイベントを受信すると、メソッドが再度呼び出されます。スタックトレースは次のようになります(NSRunLoopに関連するフレームがさらに多くなります)。

main
NSApplicationMain
-[NSRunLoop runUntilDate:]
your method
-[NSRunLoop runUntilDate:]
your method

なぜ電話をかけているのかわかりませんrunUntilDate:が、それはおそらく正当な理由ではありません。

完了ハンドラーが呼び出されない理由を理解するためのヘルプが必要な場合は、doSomethingAndThenCompletionHandler:メソッドの定義を表示する必要があります。

于 2012-01-07T22:16:37.687 に答える
0

私が思う問題を理解した。私が使用しているライブラリのいくつかは、一般的な実行ループモードで実行するようにスケジュールせずにNSURLConnectionsを送信している可能性があります。コンボボックスが開いていると、実行ループモードがイベント追跡モードに変わり、コールバックを取得できなくなります。

于 2012-01-08T00:52:40.747 に答える