Для случая асинхронной отправки, который вы описали выше, вам не нужно проверять, находитесь ли вы в главном потоке. Как указывает Bavarious, он просто будет поставлен в очередь для запуска в главном потоке.
Однако, если вы попытаетесь выполнить вышеизложенное с помощью a dispatch_sync()
и ваш обратный вызов находится в главном потоке, ваше приложение будет заблокировано в этот момент. Я описываю это в своем ответе здесь , потому что это поведение удивило меня при перемещении некоторого кода из -performSelectorOnMainThread:
. Как я уже упоминал, я создал вспомогательную функцию:
void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}
который будет синхронно запускать блок в основном потоке, если метод, в котором вы находитесь, в данный момент отсутствует в основном потоке, и просто выполняет встроенный блок, если он есть. Вы можете использовать синтаксис, подобный следующему, чтобы использовать это:
runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});