@MainActor
用于确保某个类或结构体的属性和方法在主线程(UI 线程)上执行。它主要用于 SwiftUI 和 UIKit 中,以确保与用户界面相关的代码在主线程上运行,从而避免出现线程安全问题。
主要特点
-
1、线程安全:
@MainActor
确保任何被标记的代码都是在主线程上执行的,这样可以防止多线程环境中可能出现的 UI 更新问题。 -
2、简化异步编程: 使用
@MainActor
可以简化在异步代码中对主线程的切换,减少手动调度到主线程的需要。 -
3、与
async/await
配合使用:@MainActor
通常与新的async/await
异步编程模型结合使用,以确保异步任务在主线程上执行。
使用示例
以下是如何在 SwiftUI 中使用 @MainActor
的简单示例:
import SwiftUI
@MainActor
class CounterViewModel: ObservableObject {
@Published var count: Int = 0
func increment() {
count += 1
}
func reset() {
count = 0
}
}
// 创建一个视图
struct ContentView: View {
@StateObject private var viewModel = CounterViewModel()
var body: some View {
VStack {
Text("Count: \(viewModel.count)")
.font(.largeTitle)
Button(action: {
Task {
await viewModel.increment() // 使用 async/await 调用
}
}) {
Text("Increment")
}
Button(action: {
Task {
await viewModel.reset() // 使用 async/await 调用
}
}) {
Text("Reset")
}
}
.padding()
}
}
解析:
-
1、标记类:
CounterViewModel
类被标记为@MainActor
,这意味着其中的方法和属性会在主线程上执行。 -
2、安全更新状态: 由于所有访问
count
属性的方法都在主线程中执行,因此我们可以安全地更新 UI。 -
3、异步调用: 在按钮的操作中,使用
Task
来调用异步方法increment
和reset
,同时确保这些操作在主线程上完成。