gpt4 book ai didi

ios - 为什么 DispatchGroup 会干扰主队列?

转载 作者:行者123 更新时间:2023-12-04 07:26:29 24 4
gpt4 key购买 nike

我必须停止我的代码一秒钟,以便在继续之前同步服务器数据库。
下面的所有代码片段都是从主线程运行的。
我首先使用了这个:

// code 1
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
// dummy
}
// stuff
结果显然不如预期,因为东西是立即执行的。我希望在代码块之后延迟运行(不好,但这是有原因的)。
// code 2
let group = DispatchGroup()
group.enter()
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
group.leave()
}
group.wait()
// stuff
僵局!
问题 1:为什么没有 DispatchGroup 的主队列与 DispatchGroup 一起工作和锁定?
// code 3
let group = DispatchGroup()
group.enter()
DispatchQueue.global().asyncAfter(deadline: .now() + 1.0) {
group.leave()
}
group.wait()
// stuff
这可以按需要工作!
问题 2:为什么 DispatchGroup 需要全局队列来延迟运行?
我在这里读到:
https://stackoverflow.com/a/42773392/3657691/ https://stackoverflow.com/a/28821805/3657691/ https://stackoverflow.com/a/49287115/3657691/

最佳答案

我将假设您在主线程上运行这些片段,因为这很可能是问题描述中的情况。
调度队列基本上是任务队列,所以一个队列有一些任务入队。让我们看看在执行代码段时主队列上的内容会产生死锁。

  • 主队列有一个任务正在执行(执行片段的那个)
  • 然后您调用asyncAfter在指定的截止日期之后,它将在主队列上排队另一个任务(包含 group.leave() 的闭包)。

  • 现在正在执行的任务 (1.) 被对 group.wait() 的调用阻塞。 ,并且它将阻塞整个主队列,直到它完成执行。这意味着排队的任务 (2.) 必须等到第一个任务完成。您可以在此处看到 2 个任务将相互阻塞:
  • 第一个 (1.) 将等到第二个 (2.) 释放调度组
  • 第二个 (2.) 将等到第一个 (1.) 完成执行,因此可以安排

  • 对于第 2 个问题,使用全局队列(或者实际上是我们当前代码正在执行的队列以外的任何其他队列——在本例中为主队列),不会阻塞 asyncAfter。任务(显然,因为它被安排在另一个未被阻塞的队列上,因此它有机会被执行)。
    这适用于串行调度队列(主队列也是串行队列)。串行调度队列将串行执行它们的任务,即一次只有一个。
    另一方面,对于并发调度队列,这种情况不会导致死锁,因为 asyncAfter任务不会被等待任务阻塞。这是因为并发调度队列不会等待正在执行的任务完成来调度下一个入队任务。
    这甚至是一个很好的练习,可以尝试在串行队列上运行这个场景,然后在并发队列上观察差异

    关于ios - 为什么 DispatchGroup 会干扰主队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68191691/

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