Как указывает Джейкоб, хотя они могут казаться одинаковыми, это разные вещи. На самом деле, есть существенная разница в том, как они обрабатывают отправку действий в основной поток, если вы уже работаете в основном потоке.
Недавно я столкнулся с этим, когда у меня был общий метод, который иногда запускался из чего-то в основном потоке, а иногда нет. Чтобы защитить определенные обновления пользовательского интерфейса, я без проблем использовал для них -performSelectorOnMainThread:
.
Когда я переключился на использование dispatch_sync
в основной очереди, приложение блокировалось всякий раз, когда этот метод запускался в основной очереди. Чтение документации на dispatch_sync
видим:
Вызов этой функции и обращение к текущей очереди приводит к взаимоблокировке.
где для -performSelectorOnMainThread:
видим
подождите
Логическое значение, указывающее, блокируется ли текущий поток до тех пор, пока указанный селектор не будет выполнен на получателе в основном потоке. Укажите YES, чтобы заблокировать этот поток; в противном случае укажите NO, чтобы этот метод возвращался немедленно.
Если текущий поток также является основным потоком, и вы указываете YES для этого параметра, сообщение доставляется и обрабатывается немедленно.
Я по-прежнему предпочитаю элегантность GCD, лучшую проверку во время компиляции, которую он обеспечивает, и его большую гибкость в отношении аргументов и т. д., поэтому я сделал эту маленькую вспомогательную функцию для предотвращения взаимоблокировок:
void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}
Обновление: в ответ на сообщение Дэйва Дрибина о предостережения ondispatch_get_current_queue()
, я заменил [NSThread isMainThread]
в приведенном выше коде.
затем я использую
runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});
чтобы выполнять действия, которые мне нужно защитить, в основном потоке, не беспокоясь о том, в каком потоке был выполнен исходный метод.
person
Brad Larson
schedule
07.03.2011