簡體   English   中英

SwiftUI 在哪里加載數據到 MVVM

[英]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?

現在我們有足夠的設置來正確回答您的問題。

  1. 創建一個專門的網絡服務,例如;

     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 */ } }
  2. 使用它,例如;

     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** } }
  3. 完畢。

  4. 為什么我們又需要 ViewModel? 在評論中告訴我。

這真的取決於。 您是否僅將數據用於這一視圖? 還是您在整個應用程序中都使用它?

僅用於此視圖的數據

ViewModel獲取數據很好。 查看此repo以獲取示例。

請注意,存儲在ObservableObject中的數據不會持久化。 因此,您必須將ViewModel作為@State存儲在父視圖中。 這里

為整個應用程序持久化的數據

然后我建議使用.environmentObject()將某種“存儲”加載到您的視圖中。 查看此repo以獲取示例。

暫無
暫無

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

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