这是比较两个GCD队列的正确方法吗?

Sam*_*io2 2 queue grand-central-dispatch ios

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

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

    // We are currently on a background queue

} else {

    // We are on the main queue
}
Run Code Online (Sandbox Code Playgroud)

干杯

das*_*das 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.