gpt4 book ai didi

swift - 为什么 Dispatchqueue.main.async 仍然在主线程中执行 block ?

转载 作者:行者123 更新时间:2023-12-03 08:44:52 26 4
gpt4 key购买 nike

import UIKit

let serialQueue = DispatchQueue(label: "serial")


serialQueue.async {
print("Custom Serial Queue - \(Thread.isMainThread)") // print false
}

DispatchQueue.main.async {
print("Main Queue - \(Thread.isMainThread)") // print true
}


我知道我们什么时候使用.async来执行任务
我们不会阻塞主线程
这是因为我们在后台线程中执行该 block
并在完成后更新主线程


MainQueue也是一种“串行队列”
但为什么我们使用“DispatchQueue.main.async”,它仍然在主线程中执行任务
自定义串行队列可以在后台线程中执行此操作吗?

最佳答案

你说:

I know when we use .async to execute the task we won't block the main thread.

是的,我们经常异步调度到后台队列以避免阻塞主线程。但是,更准确地说,我们在技术上使用async来避免阻塞当前线程。当然,如果您在主线程上,这意味着我们不会阻塞主线程。但如果您当前正在后台线程上运行,那么async只会阻止您阻塞当前后台线程。

... but why we use DispatchQueue.main.async?

当您已经在后台线程上,但有一些东西(例如 UI 更新)必须在主线程上运行时,通常会使用此方法。然后,您可以将该 UI 更新从后台线程分派(dispatch)回主队列。我们通常会异步执行此操作,因为让后台线程等待 UI 更新是没有意义的。

例如

DispatchQueue.global().async {
// do something computationally intensive here ...

// ... but when you want to update the UI with the result, you’d dispatch that back to the main queue

DispatchQueue.main.async {
self.label.text = ...
}
}

或者,在使用 URLSession(或在后台线程上运行的任何内容)时,您会使用相同的模式。如果我们当前位于某个后台线程上,但需要执行 UI 更新(这必须始终在主线程上进行),我们会使用 DispatchQueue.main.async。因此,我们会将这些 UI 更新分派(dispatch)回主队列。

这就是我们使用DispatchQueue.main.async的原因。话虽如此,虽然它很少有任何实用性,但从技术上讲,您可以从主线程异步分派(dispatch)回自身,就像您在问题中所做的那样。所发生的情况是,分派(dispatch)的代码将被添加到主队列的末尾,但在您完成之前在主线程上执行的操作之前不会运行。

例如,假设以下代码在主线程上运行

print("a")
DispatchQueue.main.async {
print("b")
}
print("c")

您将看到“a”,print("b") 将排队(但尚未运行),然后您将继续主线程并看到“c” 。然后,当您最终返回到应用程序的运行循环时,只有这样主线程才会被释放,以便可以执行 print("b") 。所以你会首先看到“a”和“c”,然后是“b”!

关于swift - 为什么 Dispatchqueue.main.async 仍然在主线程中执行 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61926922/

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