2015-04-17 4 views
1

Это довольно часто можно увидеть в реальных случаях, dispatch_async (dispatch_get_main_queue() реализуется на UI тему. Я не могу понять его назначение.Цель работы dispatch_async (dispatch_get_main_queue() на UI тему

Мое мышление так есть только один поток в потоке пользовательского интерфейса, что цель dispatch_async

Возьмите реальный пример, который я встретил дней назад здесь:

Выполнить «NSTimer scheduledTimerWithTimeInterval» в потоке пользовательского интерфейса, чтобы обновить «_scrollView contentOffset»

1 нет отправка: не setContentOffset получить силу до следующего графика NSTimer

2 с отправкой: setContentOffset получить силу немедленно

+0

Можете ли вы привести какой-то контекст? Возможно, код * может * быть запущен из фонового потока, поэтому нужно быть в безопасности. В противном случае это может быть просто задержка кода, пока, возможно, у механизма компоновки не было времени для запуска. –

+0

Я привел пример выше – Jacky

ответ

0

dispatch_async(dispatch_get_main_queue(), ...) заставляет блок кода, который будет выполняться асинхронно на следующем цикле выполнения основной нити (Поток пользовательского интерфейса). Некоторый код должен быть запущен в потоке пользовательского интерфейса, например, добавление/удаление виджетов из пользовательского интерфейса или обновление пользовательского интерфейса.

dispatch_async(..) используется, чтобы не блокировать текущую резьбу.

+0

На практике и в реальности я нашел, что этот способ может ускорить выполнение, когда поток пользовательского интерфейса занят несколькими другими задачами, хотя это и не имеет смысла. – Jacky

0
dispatch_async(dispatch_get_main_queue(), 
         ^{ 
          // perform something on UI 
         }); 

dispatch_async - это API GCD низкого уровня (Grand Central Dispatch API). Как известно, основной поток приложений используется для выполнения любых действий в пользовательском интерфейсе, таких как выполнение анимаций/любых других связанных с пользовательским интерфейсом материалов, поэтому в контексте выполнения некоторой работы с пользовательским интерфейсом важно, чтобы он имел доступ к основному потоку и что выше GCD API обеспечивает тот же гарантированный доступ к основному потоку для пользовательского интерфейса для выполнения любых связанных операций.

0

GCD в основной очереди обычно делается из очереди фона, чтобы сигнализировать о завершении некоторой фоновой обработки. Например,

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^{ 
    // Here you are doing a very expensive operation which will take let say 5 secs. And after 5 sec you will got your result. Let say 

    int output = //calculated result. 

    dispatch_async(dispatch_get_main_queue(), ^{ 
      [[self myLable] setText:[NSString stringWithFormat:@"%d", output]];  
    }); 
}); 

В этом случае мы делаем длинный расчет в фоновом порядке, чтобы не блокировать основной поток. И после получения результата нам нужно обновить интерфейс. UIKit не должен быть доступен из любой другой нити, к ней следует обращаться от main thread, чтобы избежать состояния гонки и предотвратить сбой при доступе UIKit. Итак, здесь мы используем dispatch_async, чтобы дать возможность основному потоку работать dispatch_get_main_queue().

0

Я лично использую его, когда внутри другого dispatch_async (фон, без UI потока) - когда я делаю что-то вроде вычислений или просто что-нибудь, что может работать в фоновом потоке , а затем я хочу «вернуться» и обновление пользовательский интерфейс соответственно, dispatch_async(dispatch_get_main_queue()...) возвращает меня обратно в поток пользовательского интерфейса, и поэтому я могу обновить интерфейс. В противном случае, если я останусь в фоновом потоке в первом dispatch_async, никаких изменений в пользовательском интерфейсе не произойдет.

0

Возможно, код «dispatch_async» отсутствует в основной теме, dispatch_get_main_queue гарантирует, что код в блоке работает в основном потоке.

ему нравится выполнятьselectonmainthread,

Смежные вопросы