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从主线程调用时.
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)
| 归档时间: |
|
| 查看次数: |
7663 次 |
| 最近记录: |