我正在运行什么GCD队列,主要与否?

nac*_*o4d 10 cocoa multithreading objective-c grand-central-dispatch

我正在尝试编写一些线程安全的方法,所以我正在使用:

...
dispatch_queue_t main = dispatch_get_main_queue();
dispatch_sync(main,^{
  [self doSomethingInTheForeground];
});
...
Run Code Online (Sandbox Code Playgroud)

但是如果我在主线程上没有必要,我可以跳过所有这些调度调用,所以我想知道我目前正在使用什么线程.我怎么知道这个?

或者,也许它在性能方面没有差别?

可以做这个比较吗?

if (dispatch_get_main_queue() == dispatch_get_current_queue()){...}
Run Code Online (Sandbox Code Playgroud)

smp*_*kes 13

更新的答案:

Apple文档已更改,现在说"当从提交的块的上下文外部调用时,如果从主线程执行调用,则此函数返回主队列.如果调用是从任何其他线程调用的,则此函数返回默认的并发队列." 所以检查dispatch_get_main_queue() == dispatch_get_current_queue()应该有效.

原始答案:

使用dispatch_get_main_queue() == dispatch_get_current_queue()不起作用.文档dispatch_get_current_queue说"当在提交的块的上下文之外调用时,此函数返回默认的并发队列".默认并发队列不是主队列.

[NSThread isMainThread]应该为你想要的东西工作.注意,[NSThread isMainThread]对于除主队列之外的队列可以是真的,例如,当dispatch_sync从主线程调用时.

  • 看起来`dispatch_get_current_queue()`现在已被弃用,有什么替代方案? (3认同)
  • 实际上,它说"当从提交的块的上下文外部调用时,如果从主线程*执行调用,则此函数*返回主队列.如果从任何其他线程调用,则此函数返回默认值并发队列." (2认同)

amb*_*ght 12

折旧dispatch_get_current_queue(),相当于(dispatch_get_main_queue() == dispatch_get_current_queue())

现在通过队列标签比较,它是:

(dispatch_queue_get_label(dispatch_get_main_queue()) == dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL))
Run Code Online (Sandbox Code Playgroud)