13

这段代码

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 什么都不做,那么它有什么意义呢?

4

3 回答 3

11

因为队列不是线程,为了检查您是否在主“队列”上,您必须使用不同的代码,类似于以下内容:

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

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

于 2013-02-05T20:50:19.507 回答
5

这是记录在案的行为。作为一种优化,dispatch_sync如果可能,传递给的块将在当前线程上执行(几乎总是如此)。

于 2013-02-05T20:46:04.697 回答
1

我从 Apple 的GCD 指南中了解到,不能保证调度队列将在单独的线程上执行。GCD 将确定哪个线程,并在必要时创建一个新线程。

部分要点是现在您不必考虑线程。

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

// on background queue
dispatch_async( dispatch_get_main_queue(), ^(void){
    someLabel.text = @"My Text";
});
于 2013-02-05T20:39:56.550 回答