小编Nir*_*gar的帖子

为什么 SwiftUI 视图模型应该用 @MainActor 注解?

我一直在观看 Apple 在 WWDC21 上的并发演讲,并阅读了大量有关 Apple 并发更新的文章;然而,我无法理解一件事:为什么人们会提供指导,让你应该用它来注释视图模型@MainActor?据我所知,通过将视图模型属性设置为视图中的@StateObject或,它会自动变为. 那么如果是这样的话,为什么人们仍然建议将视图模型注释为?@ObservedObject@MainActor@MainActor

\n

对于上下文,以下是我读过的一些引用此内容的文章:

\n
    \n
  1. https://www.hackingwithswift.com/quick-start/concurrency/understanding-how-global-actor-inference-works
  2. \n
  3. https://www.hackingwithswift.com/books/concurrency/how-to-use-mainactor-to-run-code-on-the-main-queue
  4. \n
  5. https://peterfriese.dev/swiftui-concurrency-essentials-part1/
  6. \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
\n

总而言之,如果指导会自动为我们处理,我有点困惑。特别是因为我不知道在 SwiftUI 中有一个不是@ObservableObject.

\n …

actor ios swift swiftui swift-concurrency

11
推荐指数
1
解决办法
6785
查看次数

标签 统计

actor ×1

ios ×1

swift ×1

swift-concurrency ×1

swiftui ×1