【问题标题】:Why did Apple deprecate dispatch_get_current_queue? [closed]为什么 Apple 弃用 dispatch_get_current_queue? [关闭]
【发布时间】:2014-05-30 13:37:06
【问题描述】:

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

【问题讨论】:

标签: objective-c grand-central-dispatch


【解决方案1】:

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

例如,如果您有以队列 A 为目标的队列 B,那么对于提交给队列 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 中详细介绍了这种特殊情况。

【讨论】:

  • 谢谢 - 我对“以队列 A 为目标的队列 B”的概念有点迷茫。一个队列指向另一个队列是什么意思?
  • 查看dispatch_set_target_queue() 的文档。当您创建一个新的私有队列时,默认情况下它以默认优先级全局并发队列为目标(即dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0))。您可以使用dispatch_set_target_queue() 更改它的目标。这允许您设置任意层次的队列。
  • 好的,每个队列都可以有一个目标队列,所以队列可以在树中排序,但是我是哪个队列哪个是叶子是一个合理的问题?!​​
  • 正如我在回答中所解释的那样,如果您只想知道“叶子”队列,那么您可以通过将块提交到该叶子队列来获得该信息。即,您可以在提交之前在块的闭包中捕获对队列的引用。我知道这很笨拙,但实际上,需要知道您正在执行的队列通常是一种“代码味道”。您为什么不发布一个新问题,询问如何在此处实际上尝试做任何事情?
  • 你好意思提这点秘传,然后给大家解释一下。在广大大多数情况下,它充分和权威的。当您的应用程序的主循环使用dispatch_main() 而不是普通的 GUI 框架完成时,这是不够的。实际上,您使用dispatch_main() 并且仍然需要知道您是否在主队列中的情况非常少见。 (前者通常是非 GUI 进程,后者通常是 GUI 应用程序,其中某些事情必须在主线程上发生。)
【解决方案2】:

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

这是来自文档的引用:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多