Обновление компонентов пользовательского интерфейса из асинхронного обратного вызова (dispatch_queue) - PullRequest
2 голосов
/ 04 января 2012

как я могу обновить элементы графического интерфейса со значениями из очереди?если я использую асинхронную конструкцию очереди, 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 ]

9 голосов
/ 04 января 2012

Как сказал @MarkGranoff, весь пользовательский интерфейс должен обрабатываться в основном потоке. Вы можете сделать это с executeSelectorOnMainThread, но с 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
}   
2 голосов
/ 04 января 2012

Любое обновление пользовательского интерфейса должно выполняться в основном потоке.Таким образом, ваш код должен быть изменен, чтобы использовать основную очередь отправки, а не очередь вашего собственного создания.Или любой из методов performSelectorOnMainThread также будет работать.(Но GCD - это путь, в наши дни!)

...