Apple为什么弃用dispatch_get_current_queue?

时间:2014-05-30 13:37:07

标签: objective-c grand-central-dispatch

Apple为何弃用dispatch_get_current_queue?这次电话有什么不安全之处?

2 个答案:

答案 0 :(得分:14)

dispatch_get_current_queue从一开始就没有真正理解。这就是为什么:有一小部分" root"队列(每个优先级一个,然后是主队列)。每个其他队列最终都会定位到其中一个根队列。这意味着,在一般情况下,问题没有一个答案,"我正在运行什么队列?"

例如,如果您的队列B以队列A为目标,则对于提交到队列B的块,A B将是该问题的合理答案。此外,因为所有队列最终定位一个全局/根队列,可以说最佳答案将是"它最终在"上执行的任何根队列,除了对这些队列并不真正有用任何人,因为它没有显着区分任何东西。

根据我的经验,在大多数情况下,人们对dispatch_get_current_queue的期望是答案,"我最初提交的队列是什么?"但是,根据定义,提交块的任何代码已经知道它提交的队列(因为它正在进行提交)。所以可以说,如果你需要捕获这些信息,你可以在入队时间这样做;你不需要dispatch_get_current_queue来回答这个问题。对于这些情况,dispatch_get_current_queue只是一个捷径,而且是一个有缺陷的(由于队列定位。)

另一大类案例是,当您想知道自己是否在主队列中时。 -[NSThread isMainThread]对此具有足够的权威性,因此您也不需要dispatch_get_current_queue

另一位回答者还指出,dispatch_get_current_queue经常被误用于试图模仿GCD队列的递归锁定。在基于队列的系统中可靠地实现递归锁是不可能的,因为"队列不能锁定"。我已经详细地写了another answer中的特定情况。

答案 1 :(得分:2)

可能与错误的方法使用有关。

以下是文档引用:

  

建议仅用于调试和日志记录:代码不得   对返回的队列做出任何假设,除非它是其中之一   全局队列或代码本身创建的队列。代码必须   不要假设同步执行到队列是安全的   如果该队列不是返回的队列,则死锁   dispatch_get_current_queue()。

setFlipped:NSImage的情况也是如此 - Apple弃用了它们,因为程序员以“错误”的方式使用它:

  

图像的翻转属性被广泛误解,已被弃用。