0

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?私はそれがこの問題と関係があるかもしれないと思います。皆さんはどう思いますか?

+1

'dispatch_async'を動作させるためには、実行ループを心配する必要はありません。完了ハンドラで何をしていますか? –

+0

これは動作するかどうかをテストするためのプリント文です。また、他のUIトリガーの影響を受けているようだ。テキストフィールドに1文字または2文字を入力してから、テキストフィールドをクリックしてフォーカスを失った場合、すべての完了ハンドラが起動します。 – JPC

+0

私は何かを達成しようとしていません。私はそれが機能するかどうかを調べるためにそれを入れたので、それがなければ働いていなかった。実験のためだけに実際にあります – JPC

答えて

0

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

1

[[NSRunLoop currentRunLoop] runUntilDate:fiveSecondsFromNow]を実行すると、実行ループに再帰的に入り、実行ループはイベントを正常に処理します。したがって、テキストフィールドが別のイベントを受け取った場合は、再度メソッドを呼び出します。スタックトレースは、この(NSRunLoopに関連する多くのより多くのフレームを含む)のようなものになります。

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

を私はあなたがrunUntilDate:を呼んでいる理由はわかりませんが、それは正当な理由のために、おそらくではありません。

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

+0

問題をよりよく反映するように投稿を更新しました。私は実行ループのものを使用していません – JPC

+1

'doSomethingAndThenCompletionHandler:'の定義を参照する必要があります。 –

+0

残念ながら私は定義を表示することはできませんが、nsurlconnectionを使用して非同期要求を生成するとも言えます...要求もすべて機能し、UI要素がフォーカスを失うまで補完ハンドラがコールバックされません – JPC

関連する問題