MainActor.run 是 Swift Concurrency 提供的一个方法,用于:
在异步上下文中 临时切换到主线程执行一段代码。
这在更新 UI 或访问必须在主线程运行的代码时非常常用。
基本用法
await MainActor.run {
// 这段代码保证运行在主线程
}
MainActor.run可以将包裹的代码运行在主线程中。
代码示例
1、后台任务更新 UI:
Task {
let data = await loadDataFromNetwork()
await MainActor.run {
// 这里是主线程
self.label.text = data.title
}
}
loadDataFromNetwork() 在后台执行。
label.text = … 这句必须在主线程,所以用 MainActor.run 包裹。
2、在 Swift 6 中访问 Thread.isMainThread:
Task {
print(Thread.isMainThread) // Swift 6 会报错
}
使用MainActor.run:
await MainActor.run {
print(Thread.isMainThread) // OK,确保在主线程
}
3、结合 async let 或多个任务时切换 UI:
Task {
async let image = fetchImage()
async let user = fetchUserInfo()
let (img, userInfo) = await (image, user)
await MainActor.run {
self.imageView.image = img
self.nameLabel.text = userInfo.name
}
}
为什么不使用DispatchQueue.main.async?
MainActor.run 是 Swift Concurrency 的原生方法,优点:
1、支持await,DispatchQueue.main.async不支持await。
2、类型安全。
3、完全兼容Swift并发模型。
总结
在异步任务完成后,更新UI时,或者需要将UI操作切换会主线程时,应该使用MainActor.run。
如果整个函数都是UI操作,建议使用@MainActor。
相关文章
1、Swift主线程标记@MainActor:https://fangjunyu.com/2024/12/25/swift%e4%b8%bb%e7%ba%bf%e7%a8%8b%e6%a0%87%e8%ae%b0mainactor/
2、Swift主线程:https://fangjunyu.com/2024/12/25/swift%e4%b8%bb%e7%ba%bf%e7%a8%8b/