gpt4 book ai didi

ios - 当前队列、调度队列和目标队列在GCD中是如何相互通信的?

转载 作者:行者123 更新时间:2023-11-28 23:19:35 26 4
gpt4 key购买 nike

我正在关注 GCD 的博客、在线文章和视频,我遇到了一个术语目标队列(在一些博客上)。我以为我了解 GCD,但后来这个目标队列术语让我很困惑。

我的理解是:

例如:

viewdidload(){
DispatchQueue.main.async{
print("hello world")
}
}
  • 当前队列:主队列,作为从主线程调用的 viewdidload。
  • 调度队列:主队列因为“DispatchQueue.main”
  • 目标队列:我不太确定,它可以是并发队列,但是当前队列、调度队列和目标队列如何在 GCD 中相互通信?

最佳答案

目标队列是一个不太常用的高级主题。除非您有非常具体的需求(见下文),否则您可以安全地忽略此功能。

当您创建一个自定义队列时,您可以将其定义为一个目标,一个您的自定义队列将在幕后使用的队列。因此,如果您创建一个队列 A,其中包含一个目标队列 T,那么任何分派(dispatch)到 A 的内容实际上都会在 T 上运行。因此,您可能会问什么时候可能倾向于使用这种模式:

  1. 也许您有多个队列想要共享某些行为。例如,您可能有队列 ABC,它们都使用串行队列 T 作为它们的队列目标。然后,不仅 ABC 是连续的、单独的,而且 A >BC。例如。将一些东西派发到 A 并将另一件事派发到 B 队列中,B 上的任务将等待 A 上的任务完成(由于 T 的串行性质,它们共享目标队列)。

    或者假设您有三个并发队列,ABC,但您有时想对所有队列做一个屏障第三,一些关键任务不能与这三个队列上运行的任何东西同时运行。如果在创建 ABC 时,您将并发队列 T 指定为目标队列对于所有这些,如果您向 T 添加屏障任务,则 ABC 将所有人都尊重这个障碍。

  2. 如果您分析代码并发现在 GCD 代码导致不同线程之间不断跳转的地方发生了大量“上下文切换”,您可能会使用目标队列。对于常见的 GCD 应用程序(例如,在某些后台队列上运行这个计算量大的代码,然后将更新分派(dispatch)回主队列),这个目标队列概念没有提供任何实际好处。但是,如果你在 GCD 队列之间进行数千/数百万次调度,它可能是相关的。但是在你打扰之前分析你的代码,以检测发生了多少上下文切换,看看这是否会在你的场景中提供任何实际好处。

    有关您可以在哪些地方使用目标队列来解决这些性能相关问题的示例,请参阅 WWDC 2017 视频 Modernizing Grand Central Dispatch Usage: Introducing Unified Queue Identity .在上面的链接中,我试图让您进入视频的相关部分,但观看整个视频可能会提供更多背景信息。

最重要的是,在某些情况下您可能需要指定目标队列,但这在实践中并不常见。

关于ios - 当前队列、调度队列和目标队列在GCD中是如何相互通信的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59828733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com