1

可能であれば、これを行うためのより良い方法を探しています。

ローカルのsqliteデータベースを更新する非同期コールバックがあります。更新が完了したら、シングルトン変数(archiveUpdateComplete)にフラグを設定しました。フラグがtrueに設定されるまで、しばらくの間眠ります。その後、テーブルビューをハイドレイトします。sleep()を削除したい!提案をありがとう。

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)




- (void)viewDidLoad
{



  dispatch_async(kBgQueue, ^{

    //Hydrate word archive table view

       do {
             sleep(1.0);


           } while ([sharedManager archiveUpdateComplete]==NO);



      [self performSelectorOnMainThread:@selector(hydrateWordArchive) withObject:nil waitUntilDone:YES];


      //Run custom activity indicator
      dispatch_async(dispatch_get_main_queue(), ^{
        [MBProgressHUD hideHUDForView:self.view animated:YES];

      });



  });

}
4

2 に答える 2

3

投票する必要がある場合

ポーリング/睡眠が必要または良いことはめったにありません。別の方法として:

  • NSTimerメインスレッドの実行ループにをアタッチできます。
  • タイマー呼び出しがテストできるセレクター[sharedManager archiveUpdateComplete]
  • YESが返される場合は、
    • タイマーを無効にする
    • 電話[MBProgressHUD hideHUDForView:self.view animated:YES];

投票する必要がない場合

いくつかの即時の選択肢があります。どちらを選択するかは、何が何を知っているかによって異なります。

  • 上司が完了後に誰にメッセージを送信するかを知っている場合、上司は単にメッセージを送信できます。それがメインスレッドで発生する必要がある場合は、メインスレッド-[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]に転送するために使用できます。このアプローチは、代理人にも見られるかもしれません。シングルトンの場合、このルートを取ることはあまり意味がありません。

  • 上司が変更/完了に関心のある人を知らない場合、上司はNSNotificationタスクの終了後に(現在のスレッドまたはメインスレッドから)投稿することができます。

  • Key Value Observing(KVO)は別のオプションです。

于 2012-08-27T11:24:11.263 に答える
0

おそらく何かが足りないのですが、これには完了コールバックを使用してみませんか?

言い換えれば、ネストされたブロックに関して「考える」ように計算を変更します。最初の非同期ブロック (いくつかの同時キュー上) はデータベースを更新する作業を行い、それが完了すると、テーブルビューをハイドレートする別の非同期ブロックを (同じ同時キューに) ディスパッチします。最後に、そのブロックから、メイン キューで実行する必要がある唯一のビットであるため、UI を更新するメイン キューの別のブロックを dispatch_async します。

つまり、ポーリングするのではなく、非同期操作をチェーンする必要があります。dispatch_async() については、man ページの COMPLETION CALLBACKS セクションを参照してください。

于 2012-08-27T20:46:19.003 に答える