[英]Why Should SwiftUI View Models be Annotated with @MainActor?
我一直在觀看 Apple 在 WWDC21 上的並發討論,並閱讀了大量有關 Apple 並發更新的文章; 但是,我無法解決一件事:為什么人們會提供指導,告訴您應該使用@MainActor
注釋視圖模型? 根據我的閱讀,通過在視圖中將視圖 model 屬性設置為@StateObject
或@ObservedObject
,它會自動變為@MainActor
。 所以如果是這樣的話,為什么人們仍然建議將視圖模型注釋為@MainActor
?
對於上下文,這里有一些我讀過的文章參考了這個:
摘自第一個鏈接:
[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.