在关于SO的早期问题之后,我现在想要比较两个不同的大型中央调度队列,以尝试确定当前代码是否正在主线程上运行。我的问题很简单:这是实现这一目标的有效方法吗?或者是否有一些我没有考虑过这样做的陷阱?
if (dispatch_get_current_queue() != dispatch_get_main_queue()) {
// We are currently on a background queue
} else {
// We are on the main queue
}
干杯
答案 0 :(得分:6)
将当前队列与主队列进行比较不是检查您是否在主线程上运行的有效方法。
使用[NSThread isMainThread]
或pthread_main_np()
明确检查您是否在主线程上,如果这是您想知道的。
您可以在主线程上,而当前队列不是主队列,并且您可以在主队列中,而当前线程不是主线程(后者仅在调用dispatch_main()
时才会被调用,但是静止)。
在最近的版本中,这在dispatch_get_main_queue(3)联机帮助页的CAVEATS部分中明确记录:
在主线程上调用dispatch_get_main_queue()的结果可能会或可能不会等于dispatch_get_current_queue()的结果。比较这两者不是测试代码是否在主线程上执行的有效方法。 Foundation / AppKit程序应该使用[NSThread isMainThread]。 POSIX程序可以使用pthread_main_np(3)。
通常,您应该避免使用队列指针比较来影响程序逻辑。调度队列存在于依赖关系树(目标队列层次结构)中,并且比较该树中的各个叶子而不考虑它们的相互依赖性,因此无法提供足够的信息来做出安全决策。
如果您确实需要基于队列相互依赖性的程序逻辑,请使用dispatch_get_specific(3)
/ dispatch_queue_set_specific(3)
API,这些API可识别目标队列并且更加明确。