为什么苹果弃用了dispatch_get_current_queue?这个调用有哪些风险?
为什么苹果弃用了dispatch_get_current_queue?这个调用有哪些风险?
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队列模拟递归锁。在基于队列的系统中可靠地实现递归锁是不可能的,因为“队列不是锁”。 我在另一个答案中详细谈到了这个特定情况。
dispatch_set_target_queue()
的文档。当您创建一个新的私有队列时,默认情况下它会将目标设置为默认优先级全局并发队列(即 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
)。您可以使用 dispatch_set_target_queue()
更改其目标。这使您能够设置任意层次结构的队列。 - ipmccdispatch_main()
而不是正常的GUI框架时,它是不够的。实际上,你会使用dispatch_main()
并仍然需要知道是否在主队列上的情况非常罕见。(前者通常是非GUI进程,后者通常是GUI应用程序,在其中某些事情必须在主线程上发生。) - ipmccNSImage
中的 setFlipped:
也面临着相同的情况 - 苹果已将其弃用,因为程序员们以“错误”的方式使用它们: