Обратите внимание, что основная очередь не совпадает с основным потоком.Можно легко работать с неосновной очередью в основном потоке, когда dispatch_sync () используется в очереди из основного потока.Гораздо реже, в инструментах командной строки, которые используют dispatch_main () вместо NSRunLoops (то есть, кроме приложений Какао / iOS), главная очередь может выполняться в чем-то отличном от основного потока.
Если вы имеете дело с кодом, который требует основную очередь, а не только основной поток (скажем, код, который ожидает значения, которые он установил в главной очереди от queue_get_specific, что, по слухам, должен делать VectorKit / MapKit), лучше проверитьосновная очередь явно, а не основной поток.
Одна опция для явной проверки основной очереди:
BOOL MyIsMainQueue(void)
{
static char MAIN_IND_KEY;
static char MAIN_IND_VAL;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dispatch_queue_set_specific(dispatch_get_main_queue(), &MAIN_IND_KEY, &MAIN_IND_VAL, NULL);
});
return dispatch_get_specific(&MAIN_IND_KEY) == &MAIN_IND_VAL;
}
Ответ с использованием DISPATCH_CURRENT_QUEUE_LABEL также должен работать и, вероятно, лучше, хотя может и не работатьработать (т.е. сбой) до MacOS 10.9 и iOS7, когда был определен DISPATCH_CURRENT_QUEUE_LABEL.