`[NSThread isMainThread]`总是返回YES

Dan*_*ark 12 grand-central-dispatch ios

这段代码

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

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

queue = dispatch_queue_create("nonMainQueue", NULL);
Run Code Online (Sandbox Code Playgroud)

仍然报告说我在主队列中.这似乎是因为我正在使用dispatch sync.

这是否意味着我的代码与不使用dispatch_sync相同?另外:如果dispatch_sync什么都不做的话,那又有什么意义呢?

Ric*_*III 11

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

if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
   NSLog(@"On Main Thread!");
}
Run Code Online (Sandbox Code Playgroud)

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

  • 很公平.我个人不会依赖6.0中弃用的功能,并明确告诫它不应该以你建议的方式使用.鉴于文档未能承认它已被弃用,也不会在那里灌输信心.嘿,如果它对你有用,那就用吧.我只是不同意你对文档的信心. (2认同)

Sve*_*ven 5

这是记录在案的行为.作为优化,传递给的块dispatch_sync在可能的情况下在当前线程上执行(几乎总是如此).

  • 针对全局并发队列的dispatch_sync是noop,它直接执行指定的块.这是因为全局并发队列没有排序. (2认同)