2012-04-13 12 views
1

私のiOSアプリケーションで奇妙な動作が検出されました。私は、セレクタとターゲットでdispatch_asyncを呼び出します。セレクタが呼び出されますが、ホームボタンをクリックするまでインターフェイスが更新されません。

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
      CMLog(@"Start Save RoundQuestions Asynchronously"); 
      [round saveRoundQuestions:target selector:selector]; 
     }); 

その関数それが仕事だ終了し、これを呼び出します:ログが正常に実行されているすべてのものを示して

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" 
     [target performSelector:selector]; 
#pragma clang diagnostic pop 

、しかしターゲットはnavigationControllerにpushViewControllerを呼び出し、それが永遠にかかる私はこのコードを持っています実際のプッシュを行います。私はホームボタンをクリックすることでそれを強制することができます。私はおそらくスレッドの安全性に違反していると読んだことがあり、実行ループを起こす必要があるかもしれません。

dispatch_asyncからセレクタを呼び出すのは間違っていますか?または、UIがあるメインスレッドでセレクタを実行する必要がありますか?

EDIT:実際に問題を見つけました。私はsaveRoundQuestions内のUIをブロックしていた関数を呼び出していたことが判明しました。これは、プッシュアニメーションを強制的に行の裏側に押し付けていると考えています。私はこの機能をバックグラウンドに置き、プッシュアニメーションはすぐに起こります。しかし、なぜ私はまだ興味がありますか?あなたが使用してメインキューを取得する必要がありますので、

答えて

1

あなたは成功しdispatch_asyncを使用してUIを更新することができます。ちょうどdispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)の代わりに使用dispatch get_main_queue()

編集: あなたのアップデートに従って。あなたはsaveRoundQuestions内でいくつかの高価な仕事をして、その後のupdateUIされている場合は、使用する必要があります。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     CMLog(@"Start Save RoundQuestions Asynchronously"); 
     [round saveRoundQuestions:target selector:selector]; 
    }); 

そしてsaveRoundQuestionsの内側にUIを更新するためにdispatch_get_main_queue()に別のブロックを置きます。

4

あなたが唯一のメインスレッド上でUIの更新を行う必要があります。

dispatch_get_main_queue() 

代わりのdispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)

私の答えはまだ立って、dispatch_get_global_queue woudという保証はありません dispatch_get_gl:メインスレッドのキューを返す、それが

名前だけで優先度の高いキューですobal_queue
要約:与えられた優先レベルのよく知られたグローバル並行キューを返します。

+0

どちらの答えが正しいと働いていた、しかし、私は私が原因saveRoundQuestionsで重いプロセスの非同期を派遣して、私は賞に彼をつもりですので、他の答えは少し良く私の問題を理解すると思います。とにかくあなたはいくつかの衝突を持っているように見えます。 :) –

+0

どちらもありがとうございます。それは私がDOHの瞬間だったので、私はそれがメインのキューで実行されていないことを知っていたので、少しだった。 –

関連する問題