Nir*_*gar 11 actor ios swift swiftui swift-concurrency
我一直在观看 Apple 在 WWDC21 上的并发演讲,并阅读了大量有关 Apple 并发更新的文章;然而,我无法理解一件事:为什么人们会提供指导,让你应该用它来注释视图模型@MainActor?据我所知,通过将视图模型属性设置为视图中的@StateObject或,它会自动变为. 那么如果是这样的话,为什么人们仍然建议将视图模型注释为?@ObservedObject@MainActor@MainActor
对于上下文,以下是我读过的一些引用此内容的文章:
\n摘自第一个链接:
\n\n\n[A]任何使用带有 @MainActor 的属性包装器作为其包装值的结构或类将自动成为 @MainActor。这就是为什么 @StateObject 和 @ObservedObject 在使用它们的 SwiftUI 视图上传达主要参与者的原因 \xe2\x80\x93 如果您在 SwiftUI 视图中使用这两个属性包装器中的任何一个,整个视图也会变成 @MainActor。
\n
摘自第二个链接:
\n\n\n[W]每当你在视图中使用 @StateObject 或 @ObservedObject 时,Swift 都会确保整个视图在主要参与者上运行,这样你就不会意外地尝试以危险的方式发布 UI 更新。更好的是,无论您使用什么属性包装器,SwiftUI 视图的 body 属性始终在主要参与者上运行。
\n
\n\n这是否意味着您不需要显式地将 @MainActor 添加到可观察对象?好吧,不 \xe2\x80\x93 在这些类中使用 @MainActor 仍然有好处,尤其是如果它们使用 async/await 来完成自己的异步工作,例如从服务器下载数据。
\n
总而言之,如果指导会自动为我们处理,我有点困惑。特别是因为我不知道在 SwiftUI 中有一个不是@ObservableObject.
我的最后一个问题与第一个问题相关,是:如果@StateObject自动@ObservedObject创建视图@MainActor,那么@EnvironmentObject也创建视图吗@MainActor?
为了在这背后放置一些代码,我打算使用以下命令将以下类注入到环境中.environmentObject(...)
@MainActor\nclass UserSettings: ObservableObject {\n @Published var flowUser: FlowUser?\n \n init(flowUser: FlowUser? = nil) {\n self.flowUser = flowUser\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n以下是我的观点之一的视图模型:
\n@MainActor\nclass CatalogViewModel: ObservableObject {\n @Published var flowUser: FlowUser?\n \n init(flowUser: FlowUser?) {\n self.flowUser = flowUser\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n正如您所看到的,我已经创建了两个类@ObservableObjects,所以我觉得我应该能够删除@MainActor注释。
任何帮助将不胜感激!谢谢你的时间!
\n@ObservedObject 或其他对象并不使其成为主要角色。所以你的说法不属实
请参阅https://developer.apple.com/videos/play/wwdc2021/10019/大约 22 分钟

根据我的阅读,通过将视图模型属性设置为视图中的 @StateObject 或 @ObservedObject,它会自动变为 @MainActor。
| 归档时间: |
|
| 查看次数: |
6785 次 |
| 最近记录: |