gpt4 book ai didi

iOS RunLoop 和 DispatchQueue.main.async

转载 作者:行者123 更新时间:2023-12-01 19:31:19 24 4
gpt4 key购买 nike

为什么以下代码中永远不会调用 print("2") 部分?我认为内部 main.async 会将 block 插入主循环的队列中,然后 RunLoop.run 会执行它,但显然情况并非如此。(它打印 1runrunrun 等)

此外,如果我删除外部 main.async,然后直接运行该 block 中的代码(仍在主队列上,在新的单 View 应用程序的 viewDidLoad 中),那么内部的 main.async block 就会被执行(打印 1run2)。为什么这一变化会产生如此大的影响?

var x = -1
DispatchQueue.main.async { // comment out this line for question #2
print("1")
x = 1
DispatchQueue.main.async {
print("2")
x = 2
}
while x == 1 {
print("run")
RunLoop.main.run(mode: .default, before: Date() + 1)
}
} // comment out this line for question #2

最佳答案

在您的第一个示例中,第一个 async 会阻塞 main 串行队列,直到它从外部 async 调用返回,这将不会'当x1时不会发生。内部 GCD async 任务(将 x 更新为 2)将永远没有机会运行,因为串行 GCD 队列现在被阻塞在该任务中while 循环。在主运行循环上运行的尝试不会规避 GCD 串行队列的规则/行为。它只会耗尽已添加到其中的事件的运行循环。

在第二个示例中,您没有阻止 GCD main 队列,因此当您点击 run 时,更新 x 的分派(dispatch) block > to 2 确实有机会运行,让它继续。

底线是,不要将 GCD 主队列和主运行循环混为一谈。是的,它们都使用主线程,但不能使用运行循环来规避串行 GCD 队列的行为。

关于iOS RunLoop 和 DispatchQueue.main.async,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62605957/

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