从异步回调更新UI组件(dispatch_queue)

时间:2012-01-03 20:23:47

标签: iphone objective-c ios multithreading queue

如何使用队列中的值更新GUI元素? 如果我使用异步队列构造,textlable不会更新。 这是我使用的代码示例:

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

   dispatch_release(getDbSize);
}

谢谢。

2 个答案:

答案 0 :(得分:9)

正如@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 :(得分:2)

必须在主线程上执行任何UI更新。因此,您的代码需要修改才能使用主调度队列,而不是您自己创建的队列。或者,任何performSelectorOnMainThread方法都可以。 (但是GCD是最好的选择!)