@MainActor
对视图模型进行注释?从我所了解的情况来看,通过将视图模型属性设置为视图中的@StateObject
或@ObservedObject
,它会自动变为@MainActor
。那么,如果是这样的话,为什么人们仍然建议对视图模型进行@MainActor
注释呢?为了更好地理解背景,这里是我阅读过的一些文章:
- https://www.hackingwithswift.com/quick-start/concurrency/understanding-how-global-actor-inference-works
- https://www.hackingwithswift.com/books/concurrency/how-to-use-mainactor-to-run-code-on-the-main-queue
- https://peterfriese.dev/swiftui-concurrency-essentials-part1/
第二个链接的摘录如下:任何使用带有@MainActor属性包装器的结构体或类都将自动成为@MainActor。这就是使得在SwiftUI视图中使用@StateObject和@ObservedObject能够传达主actor特性的原因 - 如果您在SwiftUI视图中使用这两个属性包装器之一,则整个视图也会成为@MainActor。
每当您在视图内部使用@StateObject或@ObservedObject时,Swift都会确保整个视图在主actor上运行,以便您不会意外地以危险的方式尝试发布UI更新。更好的是,无论您使用什么属性包装器,SwiftUI视图的body属性始终在主actor上运行。
总的来说,如果所有东西都会自动处理,我对这些建议感到有点困惑。尤其是因为我不知道在SwiftUI中有哪种情况下您会有一个不是那么这是否意味着您不需要显式地向可观察对象添加@MainActor?嗯,不是-使用这些类仍然有好处,尤其是如果它们正在使用async / await来执行自己的异步工作(例如从服务器下载数据)。
@ObservableObject
的视图模型。
与第一个问题相关的我的最后一个问题是:如果@StateObject
和@ObservedObject
自动使视图成为@MainActor
,那么@EnvironmentObject
是否也会使视图成为@MainActor
?
为了支持这个问题,我打算使用.environmentObject(...)
将以下类注入到环境中:
@MainActor
class UserSettings: ObservableObject {
@Published var flowUser: FlowUser?
init(flowUser: FlowUser? = nil) {
self.flowUser = flowUser
}
}
以下是我其中一个视图的视图模型:
@MainActor
class CatalogViewModel: ObservableObject {
@Published var flowUser: FlowUser?
init(flowUser: FlowUser?) {
self.flowUser = flowUser
}
}
正如您所看到的,我已经使两个类都成为@ObservableObjects
,因此我觉得应该能够删除@MainActor
注释。
非常感谢您的帮助!感谢您抽出时间阅读!
@MainActor
属性,为什么不尝试将其删除并查看会发生什么呢? - matt@StateObject
创建一个视图模型对象将会滥用它的设计。 - malhal