Firebase SwiftUI-将变量传递给可观察对象

Firebase SwiftUI-将变量传递给可观察对象,firebase,google-cloud-firestore,swiftui,Firebase,Google Cloud Firestore,Swiftui,我有一个从上一个视图接收ID值的视图。我还需要获取该ID值并将其传递到ObserveObject中,以便对该ID运行Firestore查询。我不知道如何为我的ObserveObject获取该ID struct ItemView: View { var itemName: String var itemID: String @ObservedObject var items = getItemsData() // ..... etc } class getIte

我有一个从上一个视图接收ID值的视图。我还需要获取该ID值并将其传递到ObserveObject中,以便对该ID运行Firestore查询。我不知道如何为我的ObserveObject获取该ID

struct ItemView: View {
   var itemName: String
   var itemID: String
   @ObservedObject var items = getItemsData()
   // ..... etc
   }


 class getItemsData() {
    @Published var data = [items]()
    init() {
       let db = Firestore.firestore()
       db.collection("items").whereField("itemID", isEqualTo: *THIS IS WHERE I NEED THE ITEMID *),addSnapshotListner {(snap, err) in ...
}

因此,在查询调用中,我需要根据视图顶部定义的值调用ItemID值进行查询。

我认为您的
getItemsData
类应该继承自ObserveObject

class GetItemsData: ObservableObject {...}
要将itemId放入GetItemsData实例,可以向
init()添加一个参数

}

要把这一切联系在一起,你有两个选择。您可以向ItemView添加一个init,如下所示:

struct ItemView: View {
    let itemName: String
    let itemModel: GetItemsData
    init(itemName: String, itemID: String) {
        self.itemName = itemName
        itemModel = GetItemsData(itemId: itemID)
    }
}
我更喜欢将可观察对象传递到视图中,因此它更像MVVM中的视图模型

struct ItemView: View {
    let itemName: String
    let itemModel: GetItemsData

我认为您的
getItemsData
类应该继承自observeObject

class GetItemsData: ObservableObject {...}
要将itemId放入GetItemsData实例,可以向
init()添加一个参数

}

要把这一切联系在一起,你有两个选择。您可以向ItemView添加一个init,如下所示:

struct ItemView: View {
    let itemName: String
    let itemModel: GetItemsData
    init(itemName: String, itemID: String) {
        self.itemName = itemName
        itemModel = GetItemsData(itemId: itemID)
    }
}
我更喜欢将可观察对象传递到视图中,因此它更像MVVM中的视图模型

struct ItemView: View {
    let itemName: String
    let itemModel: GetItemsData

如果您的
observateObject
具有任何状态或不位于顶层视图@tomcully way,则最终会在每个父视图更新时实例化它

而且,如果您在
init()
中调用api,您将进行许多不必要的api调用

您可以这样做:

struct ItemView: View {
   let itemName: String
   let itemID: String
   @StateObject var itemsLoader = ItemsLoader()
   var body: some View {
     ...
     ForEach(itemsLoader.items) {
     ...
    .onAppear {
      itemsLoader.load(itemID)
    }
  }
}
class ItemsLoader: ObservedObject {
    let db = Firestore.firestore()
    @Published var items: [Item] = []
    var itemID: String = ""
    
    func load(_ id: String) {
        if itemID != id {
            itemID = id
            db.collection("items").whereField("itemID", isEqualTo: itemID),addSnapshotListner {(snap, err) in ...
            }
        }
    }
}

如果您的
observateObject
具有任何状态或不位于顶层视图@tomcully way,则最终会在每个父视图更新时实例化它

而且,如果您在
init()
中调用api,您将进行许多不必要的api调用

您可以这样做:

struct ItemView: View {
   let itemName: String
   let itemID: String
   @StateObject var itemsLoader = ItemsLoader()
   var body: some View {
     ...
     ForEach(itemsLoader.items) {
     ...
    .onAppear {
      itemsLoader.load(itemID)
    }
  }
}
class ItemsLoader: ObservedObject {
    let db = Firestore.firestore()
    @Published var items: [Item] = []
    var itemID: String = ""
    
    func load(_ id: String) {
        if itemID != id {
            itemID = id
            db.collection("items").whereField("itemID", isEqualTo: itemID),addSnapshotListner {(snap, err) in ...
            }
        }
    }
}

SwiftUI视图不应初始化对象,除非您的属性对其进行包装,否则它们将丢失,因为视图结构不固定SwiftUI视图不应初始化对象,除非您的属性对其进行包装,否则它们将丢失,因为视图结构不固定