Apple为何弃用dispatch_get_current_queue?这次电话有什么不安全之处?
答案 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弃用了它们,因为程序员以“错误”的方式使用它:
图像的翻转属性被广泛误解,已被弃用。