2012-01-03 10 views
2

GUI要素をキューの値で更新するにはどうすればよいですか? 非同期キュー構成を使用している場合、textlableは更新されません。ここ は、私が使用するコードの例です:非同期コールバック(dispatch_queue)からUIコンポーネントを更新する

- (IBAction)dbSizeButton:(id)sender { 
    dispatch_queue_t getDbSize = dispatch_queue_create("getDbSize", NULL); 
    dispatch_async(getDbSize, ^(void) 
    { 
     [_dbsizeLable setText:[dbmanager getDbSize]]; 
    }); 

    dispatch_release(getDbSize); 
} 

ありがとうございました。

+0

あなたは 'performSelectorOnMainThreadを試してみました:withObject:waitUntilDone:'? – Hejazi

答えて

8

@MarkGranoffによると、すべてのUIはメインスレッドで処理する必要があります。あなたがperformSelectorOnMainThreadでそれを行うことができますが、GCDと、それはこのようなものになるだろう:

- (IBAction)dbSizeButton:(id)sender { 

    dispatch_queue_t getDbSize = dispatch_queue_create("getDbSize", NULL); 
    dispatch_queue_t main = dispatch_get_main_queue(); 
    dispatch_async(getDbSize, ^(void) 
    { 
     dispatch_async(main, ^{ 
      [_dbsizeLable setText:[dbmanager getDbSize]]; 
     }); 
    }); 

    // release 
} 
+1

あなたは、プライベートキューではなく、メインキューではなく、-getDbSizeが発生することをお勧めします。 –

+0

@Catfish_Man:しかし、プライベートキューをgetDbSizeしていませんか? – JohnK

+0

getDbSizeキューでは発生していません。これは、メインキュー上で実行されているdispatch_async'dブロックで発生しています。あなたは最初のdispatch_asyncの内側で、2番目のdispatch_asyncの外側にそれが必要です。 –

2

すべてのUI更新は、メインスレッドで実行する必要があります。だからあなたのコードは、独自の作成待ち行列ではなく、メインのディスパッチ待ち行列を使うように変更する必要があります。または、performSelectorOnMainThreadメソッドのいずれかも同様に機能します。 (しかし、GCDは最近のところです)

関連する問題