[英]SwiftUI where to load data in MVVM
我有一個名為Requests
的視圖,它有一個名為RequestViewModel
。 這個視圖 model 以Request
類型的 model 作為參數,然后它為視圖提供了幾種方法。 問題是我需要先從 firebase 加載這些requests
,但我不知道在哪里。
視圖 model 是獲取數據的好地方嗎,因為我覺得它不是? 對於其他視圖模型,我也有類似的情況; 對於前PackageViewModel
和更多...
我應該將這些數據加載到服務中的其他地方,然后將其傳遞給這個視圖 model 還是有其他方法可以做到這一點?
class RequestViewModel: ObservableObject {
@Published var request: Request
@Published var requests: [Request] = []
init(request: Request) {
self.request = request
}
func loadRequests() -> Void {
network call here {
self.requests = requests
}
}
}
使用專用網絡服務。
搜索你的感受,你知道這是真的。
問題是,它違背了你認為你知道的關於 MVVM 的一切。
大多數 MVVM 開發人員使用視圖 model 作為網絡請求(具有副作用)、業務邏輯和視圖控件的便捷包裝器。
它背后的想法是重構視圖綁定 model 和相關的邏輯/效果。
與所有設計模式一樣,一些開發人員會濫用它、扭曲它、從 java 等復制粘貼它。
隨着時間的推移,開發人員開始認為 ViewModel 是理所當然的,因為它是 Android 的規范,它必須在 iOS 中工作,對吧?
任何稱職的開發人員在嘗試將 MVVM 移植到 SwiftUI 時都會問這些問題:
SwiftUI中有綁定機制嗎? 它是如何工作的?
struct Model: View {...}
,這是模型視圖映射嗎? 如果是這樣,我可能不需要聲明單獨的 ViewModel? (僅限專業人士的問題)
誰符合 ObservableObject 就可以被觀察到(觸發視圖更新),這超出了視圖 model 的狹義定義(視圖相關屬性)。 ObservableObject 可以是服務或共享資源。 例如; 網絡服務。 恭喜,你剛剛邁出了進入更大世界的第一步。
為什么我要引入一個引用類型視圖 model 來為每個符合在圍繞值類型構建的 SDK 中的視圖的此類值類型增加值類型 model 視圖? Swift 不是 java?
現在我們有足夠的設置來正確回答您的問題。
創建一個專門的網絡服務,例如;
final class Resource: ObservableObject { // don't even need inheritance, OOP isn't always the best solution in all situations @Published var requests = [Requests]() // publish other resources func loadRequests() { /* update requests in callback */ } }
使用它,例如;
struct Model: View { @State var model = MyModel() // can be "view model", because it maps to view @EnvironmentObject var res: Resource // or as an alternative, @ObservedObject var res = Resource() var body: some View { // access the automatic binding provided by SwiftUI, eg; res.requests // call res.loadRequests() to mutate internal state of a reference type // note that stateful part of the "view model" is refactored out // so that `model` can be value type, yet it provides binding via @State // instead of ObservableObject, which has to be reference type // this is the brilliance of SwiftUI, it moves heaven and earth so you have // the safety of immutability from value type, **unlike MVVM** } }
完畢。
為什么我們又需要 ViewModel? 在評論中告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.