gpt4 book ai didi

ios - DispatchQueue 在 Swift 中与 main.sync 崩溃

转载 作者:搜寻专家 更新时间:2023-10-30 22:22:44 25 4
gpt4 key购买 nike

请向我解释为什么会发生此崩溃?

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

在这

DispatchQueue.main.sync { print("sync") }

这是我的代码。

    override func viewDidLoad() {
super.viewDidLoad()


print("Start")
DispatchQueue.main.async {
print("async")

}
DispatchQueue.main.sync {
print("sync")
}
print("Finish")
}

最佳答案

永远不要在主队列上调用同步函数

如果您在主队列上调用同步函数,它将阻塞队列,并且队列将等待任务完成但任务永远不会完成,因为它甚至无法启动队列已经被阻塞。这称为死锁

如果两个(或有时更多)项——在大多数情况下是线程——都被卡住等待对方完成或执行另一个操作,则被称为死锁。第一个无法完成,因为它正在等待第二个完成。但是第二个无法完成,因为它正在等待第一个完成。

但你需要小心。想象一下,如果您调用 sync 并定位您已经在其上运行的当前队列。这将导致死锁情况。

使用 sync 来跟踪你的调度障碍,或者当你需要等待操作完成才能使用闭包处理的数据时。

什么时候使用同步?

当我们需要等到任务完成时。 F.e.当我们确保某些函数/方法没有被重复调用时。 F.e.我们有同步并试图防止它在完全完成之前被重复调用。当您需要等待在不同队列上完成某些事情然后才继续在当前队列上工作时

同步与异步

使用 GCD,您可以同步或异步分派(dispatch)任务。

同步函数在任务完成后将控制权返回给调用者。

异步函数立即返回,命令任务完成但不等待它。因此,异步函数不会阻止当前执行线程继续执行下一个函数。

关于ios - DispatchQueue 在 Swift 中与 main.sync 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49258413/

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