簡體   English   中英

為什么 SwiftUI 視圖模型要使用 @MainActor 注釋?

[英]Why Should SwiftUI View Models be Annotated with @MainActor?

我一直在觀看 Apple 在 WWDC21 上的並發討論,並閱讀了大量有關 Apple 並發更新的文章; 但是,我無法解決一件事:為什么人們會提供指導,告訴您應該使用@MainActor注釋視圖模型? 根據我的閱讀,通過在視圖中將視圖 model 屬性設置為@StateObject@ObservedObject ,它會自動變為@MainActor 所以如果是這樣的話,為什么人們仍然建議將視圖模型注釋為@MainActor

對於上下文,這里有一些我讀過的文章參考了這個:

  1. https://www.hackingwithswift.com/quick-start/concurrency/understanding-how-global-actor-inference-works
  2. https://www.hackingwithswift.com/books/concurrency/how-to-use-mainactor-to-run-code-on-the-main-queue
  3. https://peterfriese.dev/swiftui-concurrency-essentials-part1/

摘自第一個鏈接:

[A]ny struct 或 class 使用帶有@MainActor 的屬性包裝器,其包裝值將自動為@MainActor。 這就是 @StateObject 和 @ObservedObject 在使用它們的 SwiftUI 視圖上傳達主要角色的原因——如果您在 SwiftUI 視圖中使用這兩個屬性包裝器中的任何一個,則整個視圖也將變為 @MainActor。

摘自第二個鏈接:

[W]無論何時在視圖中使用@StateObject 或@ObservedObject,Swift 將確保整個視圖在主要參與者上運行,這樣您就不會意外地嘗試以危險的方式發布 UI 更新。 更好的是,無論您使用什么屬性包裝器,您的 SwiftUI 視圖的 body 屬性始終在主要參與者上運行。

這是否意味着您不需要將@MainActor 顯式添加到可觀察對象? 好吧,不——將@MainActor 與這些類一起使用仍然有好處,尤其是如果它們使用 async/await 來完成自己的異步工作,例如從服務器下載數據。

總而言之,如果它會自動為我們處理,我對指導有點困惑。 特別是因為我不知道您在 SwiftUI 中看到不是@ObservableObject的視圖 model 的場景。

我的最后一個問題與第一個問題有關:如果@StateObject@ObservedObject自動創建視圖@MainActor ,那么@EnvironmentObject也創建視圖@MainActor

為了在這后面添加一些代碼,我打算使用.environmentObject(...)將以下 class 注入環境

@MainActor
class UserSettings: ObservableObject {
    @Published var flowUser: FlowUser?
    
    init(flowUser: FlowUser? = nil) {
        self.flowUser = flowUser
    }
}

以下是我的一個觀點 model 的觀點:

@MainActor
class CatalogViewModel: ObservableObject {
    @Published var flowUser: FlowUser?
    
    init(flowUser: FlowUser?) {
        self.flowUser = flowUser
    }
}

如您所見,我已經創建了兩個類@ObservableObjects ,所以我覺得我應該能夠刪除@MainActor注釋。

任何幫助將不勝感激! 謝謝你的時間!

@ObservedObject 或其他不會使其成為主要參與者。 所以你的說法不正確

https://developer.apple.com/videos/play/wwdc2021/10019/大約 22 分鍾在此處輸入圖像描述

根據我的閱讀,通過將視圖 model 屬性設置為視圖中的@StateObject 或@ObservedObject,它會自動變為@MainActor。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM