“总是返回YES

这个代码

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ NSLog(@"Main Thread? %d", [NSThread isMainThread]); }); 

表明我在主线程中。 即使这样做:

 queue = dispatch_queue_create("nonMainQueue", NULL); 

仍然报告我在主队列。 这似乎是因为我在使用dispatch sync

这是否意味着我的代码与根本不使用dispatch_sync相同? 另外:如果dispatch_sync什么也没有做,那么是什么意思?

因为队列不是线程,为了检查你是否在主队列中,你必须使用不同的代码,类似这样:

 if (dispatch_get_current_queue() == dispatch_get_main_queue()) { NSLog(@"On Main Thread!"); } 

请注意, dispatch_get_current_queue已被弃用,并且可能在以后的iOS / Mac OS版本中被完全删除。

这是logging的行为。 作为优化,传递给dispatch_sync的数据块在可能的情况下(几乎总是)在当前线程上执行。

我从苹果的GCD指南了解到,派遣队列将不会在单独的线程上执行。 GCD将确定哪个线程,并在必要时创build一个新线程。

其中一点就是现在你不必考虑线程。

唯一要记住的是确保你正在更新主队列上的UI元素,例如:

 // on background queue dispatch_async( dispatch_get_main_queue(), ^(void){ someLabel.text = @"My Text"; });