`[NSThread isMainThread]`总是返回YES

时间:2013-02-05 20:30:18

标签: ios grand-central-dispatch

此代码

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什么都不做,那么它的重点是什么呢?

3 个答案:

答案 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";
});