此代码
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"Main Thread? %d", [NSThread isMainThread]);
});
表明我在主线程中。即使这样做:
queue = dispatch_queue_create("nonMainQueue", NULL);
仍然报告我在主队列中。这似乎是because I'm using dispatch sync
.
这是否意味着我的代码与不使用dispatch_sync相同?另外:如果dispatch_sync什么都不做,那么它的重点是什么呢?
答案 0 :(得分:11)
因为队列不是线程,为了检查你是否在主队列中,你必须使用不同的代码,类似于:
if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
NSLog(@"On Main Thread!");
}
请注意,dispatch_get_current_queue
已弃用,并且可能会在以后的iOS / Mac OS版本中完全删除。
答案 1 :(得分:5)
这是记录在案的行为。作为优化,传递给dispatch_sync
的块在可能的情况下在当前线程上执行(几乎总是如此)。
答案 2 :(得分:1)
我对Apple的GCD guide的理解,无法保证调度队列将在单独的线程上执行。 GCD将确定哪个线程,并在必要时创建一个新线程。
部分原因是你现在不必考虑线程。
唯一要记住的是确保更新主队列上的UI元素,例如:
// on background queue
dispatch_async( dispatch_get_main_queue(), ^(void){
someLabel.text = @"My Text";
});