gpt4 book ai didi

ios - 主队列异步任务的执行顺序

转载 作者:搜寻专家 更新时间:2023-11-01 05:48:27 25 4
gpt4 key购买 nike

在下面的代码中,打印语句按照它们包含的数字(1、2、3 等)的顺序执行

override func viewDidLoad() {
super.viewDidLoad()

DispatchQueue.main.async {
print("4")
}

print("1")
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)

DispatchQueue.main.async {
print("5")
}

print("2")
}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)

DispatchQueue.main.async {
print("6")
}

print("3")
}

您能解释一下为什么执行过程会这样吗?当我们在 viewDidLoad 中异步分派(dispatch) block 时,viewWillAppearviewWillAppear 方法是否已经在队列中?

最佳答案

Are viewWillAppear and viewDidAppear methods already in the queue when we asynchronously dispatch a block in viewDidLoad?

实际上:是的。确切地说,它们不在“队列中”,但它们已经作为现有主队列代码序列的一部分在训练中。

这完全取决于 runloop 何时结束。在这种情况发生之前,异步分派(dispatch)到主队列的代码无法运行。实际上,我们必须在 print 4 等发生之前完全结束此 CATransaction(runloop 的一次“革命”)。

您可能已将此日志记录放入 Root View Controller 中。这是一种特殊情况,因为您的应用程序刚刚启动,在对 makeKeyAndVisible 的调用发送到窗口之前没有任何反应。

在那一刻,viewDidLoad 被调用,viewWillAppear 被连续调用,作为对 makeKeyAndVisible 的调用的一部分。

enter image description here

enter image description here

因此,相同的代码仍在主线程上运行;您的分派(dispatch)代码没有时间运行。所以我们先得到 print 1print 2

viewDidAppear 的情况有点不同:

enter image description here

如您所见,我们不再调用 makeKeyAndVisible。但是主线程仍在运行,因为我们立即转向任何事务完成 block (cleanUpAfterCAFlushAndRunDeferredBlocks)。将 viewDidAppear 视为 viewWillAppear 中动画的有效完成 block 可能会有所帮助。这已经配置为调用 viewWillAppear 的一部分,因此它仍然是同一事务的一部分。因此 viewDidAppear 仍然紧跟在 viewWillAppear 之后,没有停顿,我们得到 print 3

现在 启动序列终于结束,您的主队列异步代码有机会运行,它按照入队顺序执行(print 4, 打印 5, 打印 6).

关于ios - 主队列异步任务的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47962261/

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