【发布时间】:2021-06-30 09:04:26
【问题描述】:
我必须停止我的代码一秒钟,以便在继续之前同步服务器数据库。
以下所有代码 sn-ps 都是从主线程运行的。
我先用这个:
// 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/
【问题讨论】:
-
那么,你是否从主线程执行第二个 sn-p(产生死锁的那个)?
-
您滥用
DispatchGroup来强制异步函数变为同步。这是非常糟糕的做法。将// stuff放入asyncAfter的闭包中替换group.leave() -
@VladRusu:正如您在下面正确假设的那样,它确实来自主线程。我会更正我的 OP。
-
@vadian:是的,正如我所说的,代码不好,但目前更多的是用于测试。最终的生产代码将把延迟的东西保存在完成中。尽管如此,我还是不明白为什么 OP 代码的行为会如此 - 因此是这个问题。
-
如果组也在主线程上运行(显然是这样)
wait阻塞线程。强烈建议在自己的线程上运行组。再一次——顾名思义——DispatchGroup用于管理多个任务。
标签: ios swift grand-central-dispatch