Apple为什么弃用dispatch_get_current_queue?

Boo*_*oon 9 objective-c grand-central-dispatch

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

ipm*_*mcc 14

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

例如,如果您有队列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队列模拟递归锁定时经常被滥用.由于"队列不是锁",因此无法在基于队列的系统中可靠地实现递归锁.我已经在另一个答案中详细介绍了这种特殊情况.