“总是返回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"; });