objective-c - 为什么 Apple 弃用了 dispatch_get_current_queue?

标签 objective-c grand-central-dispatch

<分区>

Apple 为何弃用 dispatch_get_current_queue?这个调用有什么不安全的地方?

最佳答案

dispatch_get_current_queue 从一开始就没有真正意义。原因如下:有一些“根”队列(每个优先级一个,然后是主队列)。每个其他队列最终都以这些根队列之一为目标。这意味着,在一般情况下,“我在哪个队列上运行?”这个问题没有单一的答案。

例如,如果队列 B 以队列 A 为目标,那么对于提交给队列 B 的 block ,A B 将是该问题的合理答案。此外,由于所有队列最终以全局/根队列之一为目标,最佳答案可以说是“它最终在哪个根队列上执行”,除了这对任何人都没有用,因为它没有显着区别任何东西。

根据我的经验,在大多数情况下,人们希望从 dispatch_get_current_queue 中得到的答案是“我最初提交到哪个队列?”然而,根据定义,提交 block 的任何代码都已经知道它被提交到哪个队列(因为它正在执行提交)。因此可以说,如果您需要捕获该信息,您可以在入队时轻松地这样做;您不需要 dispatch_get_current_queue 来回答这个问题。对于这些情况,dispatch_get_current_queue 只是一个捷径,而且是一个有缺陷的捷径(因为队列定位。)

另一大类情况是您想知道自己是否在主队列中。 -[NSThread isMainThread] 对此足够/权威,因此您也不需要 dispatch_get_current_queue

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

关于objective-c - 为什么 Apple 弃用了 dispatch_get_current_queue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23955948/

相关文章:

objective-c - XCode 4 for iOS 中的绑定(bind)

objective-c - 在 Objective-C 中实现目标- Action 设计模式

ios - 如果今天是本月的最后一天,如何在 ios 中显示从当前日期算起的 7 天

ios - 等待文件加载和网络请求完成

objective-c - GCD 和 for 循环

ios - GCD 主线程崩溃问题(需要解释)?

ios - tableview 在 web 服务调用之前执行导致空白 tableview

iphone - 不确定如何修复此 EXC_BAD_ACCESS 错误

ios - 如何让 dispatch_async 运行

ios - 在获取信息时防止我的功能阻塞功能