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

在SO之前的一个问题之后,我现在正在比较两个不同的macros中央调度队列来试图确定当前的代码是否在主线程上运行。 我的问题只是:这是实现这一目标的有效方法吗? 还是有没有这样做,我没有考虑一些陷阱?

if (dispatch_get_current_queue() != dispatch_get_main_queue()) { // We are currently on a background queue } else { // We are on the main queue } 

干杯

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

使用[NSThread isMainThread]pthread_main_np()明确检查您是否在主线程上,如果这是您想知道的。

你可以在主线程上,而不用当前队列作为主队列,并且你可以在主队列上,而不需要当前线程作为主线程(只有当调用dispatch_main() ,后者才是主线程)。

在最近的发行版中,这在dispatch_get_main_queue(3)手册页的CAVEATS部分中明确logging:

在主线程上调用dispatch_get_main_queue()的结果可能会或可能不等于dispatch_get_current_queue()的结果。 比较这两个不是testing代码是否在主线程上执行的有效方法。 Foundation / AppKit程序应该使用[NSThread isMainThread]。 POSIX程序可能使用pthread_main_np(3)。

一般来说,你应该避免使用队列指针比较来影响程序逻辑。 调度队列存在于依赖树(目标队列层次结构)中,并且比较该树中的单个叶节点而不考虑它们之间的相互依赖性并不能提供足够的信息来做出安全的决定。

如果您确实需要基于队列相互依赖性的程序逻辑,请使用dispatch_get_specific(3) / dispatch_queue_set_specific(3) API,这些API可以识别目标队列,并且更加明确。