2

在之前关于 SO 的问题之后,我现在正在寻找比较两个不同的大型中央调度队列,以尝试确定当前代码是否正在主线程上运行。我的问题很简单:这是实现这一目标的有效方法吗?还是有一些我没有考虑过的陷阱?

if (dispatch_get_current_queue() != dispatch_get_main_queue()) {

    // We are currently on a background queue

} else {

    // We are on the main queue
}

干杯

4

1 回答 1

6

将当前队列与主队列进行比较不是检查您是否在主线程上运行的有效方法。

使用[NSThread isMainThread]orpthread_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,它们可以识别目标队列并且更加明确。

于 2013-07-06T22:17:37.357 回答