Firebase SwiftUI-将变量传递给可观察对象
我有一个从上一个视图接收ID值的视图。我还需要获取该ID值并将其传递到ObserveObject中,以便对该ID运行Firestore查询。我不知道如何为我的ObserveObject获取该IDFirebase 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
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视图不应初始化对象,除非您的属性对其进行包装,否则它们将丢失,因为视图结构不固定