下面是一个例子:
import SwiftUI
class VM:ObservableObject{
@Published var keepStuff = 0
init(){
keepStuff = 1
}
}
struct MyView:View{
@ObservedObject var vm = VM()
var body: some View{
Text("Hello World")
Text(String(vm.keepStuff))
}
}
这不会产生错误消息,并且按预期工作。现在,如果我把@MainActor
加到keepStuff
上,我会得到一个
注意:这个属性的变化只允许在参与者内部
例如,
@MainActor @Published var keepStuff = 0
class VM:ObservableObject{
@MainActor @Published var keepStuff = 0
init(){
keepStuff = 1
}
}
如果我@MainActor
整个类或init
,错误显然会消失。
我的理解是,@Published var
总是自动成为主actor的一部分,因此,当从任何非主actor更新@Published
var时,您会遇到错误。这里看起来几乎像是将@MainActor
添加到@Published var
,使得类的其余部分不再是MainActor
的一部分。
有人能解释一下这种行为吗?
1条答案
按热度按时间wwwo4jvm1#
我刚刚做了一个快速测试,发现使用@MainActor @Published并不能使类
@MainActor
也一样。也就是说,类中声明的任何async func都运行在后台线程上,而不是主线程上,就像如果类是@MainActor一样。