请注意,主队列与主线程不同。当在主线程的队列上使用 dispatch_sync() 时,非主队列很容易在主线程上运行。更罕见的是,在使用 dispatch_main() 代替 NSRunLoops 的命令行工具中(即,除了 Cocoa/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 时可能不起作用(即崩溃)。