有些文章说@State变量必须在主线程中更新。但我做了一些测试,发现在后台线程中更新 @State 变量是可以的。这是我的代码:
import SwiftUI
@Observable
class ViewModel {
var name = "old name"
}
struct ContentView: View {
@State var viewModel = ViewModel()
@State var title = "old title"
var body: some View {
VStack {
Text(viewModel.name)
Text(title)
}
.onAppear {
Task.detached {
viewModel.name = "new name"
title = "new title"
}
}
}
}
#Preview {
ContentView()
}
我想知道在后台线程中更新@State变量是否正确?这样做有什么缺点?谢谢。
@State
意味着每当对象发生变化时,都会导致观察者更新。在这种情况下,它们是:
Text(viewModel.name)
Text(title)
如果您在后台线程上使用
@State
也没关系,因为 body
本身始终位于主线程上:
@ViewBuilder @MainActor var body: Self.body { get }