Мне нужно отправить блок в основной очереди, синхронно. Я не знаю, работает ли Im в основном потоке или нет. Наивное решение выглядит так:
dispatch_sync(dispatch_get_main_queue(), block);
Но если Im в настоящее время внутри блока, запущенного в главной очереди, этот вызов создает тупик. (Синхронная отправка ждет завершения блока, но блок даже не запускается, так как мы ждем завершения текущего.)
Очевидным следующим шагом будет проверка текущей очереди:
if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
block();
} else {
dispatch_sync(dispatch_get_main_queue(), block);
}
Это работает, но его уродливо. Прежде чем я по крайней мере скрою его за какой-то пользовательской функцией, разве нет лучшего решения этой проблемы? Я подчеркиваю, что я не могу позволить рассылать блок асинхронно - приложение находится в ситуации, когда асинхронно отправленный блок будет выполнен "слишком поздно".