SwiftUI、Firestore获取一个集合并与另一个集合匹配
我对将一个收藏链接到另一个收藏感到困惑,任何反馈都将不胜感激。 我必须将集合编码为结构:SwiftUI、Firestore获取一个集合并与另一个集合匹配,swift,firebase,google-cloud-firestore,swiftui,Swift,Firebase,Google Cloud Firestore,Swiftui,我对将一个收藏链接到另一个收藏感到困惑,任何反馈都将不胜感激。 我必须将集合编码为结构: struct KetoTarif: Hashable, Codable, Identifiable { var id: Int var name: String } struct Keto: Hashable, Codable, Identifiable { var id: Int var breakfast: String //this should mat
struct KetoTarif: Hashable, Codable, Identifiable {
var id: Int
var name: String
}
struct Keto: Hashable, Codable, Identifiable {
var id: Int
var breakfast: String //this should match with name in KetoTarif
}
我获取Keto的数据如下:
class KetoViewModel: ObservableObject, Identifiable {
@Published var ketoDays = [Keto]()
func fetchData() {
db.collection("keto").addSnapshotListener { (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
print("No documents")
return
}
self.ketoDays = documents.compactMap { document in
do {
let x = try document.data(as: Keto.self)
return x
} catch {
print(error)
}
return nil
}
}
}
}
同样地,我也为我的第二个系列做同样的事情
class KetoTarifViewModel: ObservableObject, Identifiable {
@Published var ketoTarifler = [KetoTarif]()
func fetchData() {
db.collection("ketotarifler").addSnapshotListener { (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
print("No documents")
return
}
self.ketoTarifler = documents.compactMap { document in
do {
let x = try document.data(as: KetoTarif.self)
return x
} catch {
print(error)
}
return nil
}
}
}
}
最后,我的观点我添加了我的主要目的作为评论:
struct KetoDiyet: View {
@ObservedObject var ketoModel = KetoViewModel()
@ObservedObject var ketoTarifModel = KetoTarifViewModel()
var body: some View {
ScrollView {
Text("c")
ForEach(ketoModel.ketoDays) { keto in
//here keto.breakfast returns a string
// and I want to search/find/print that string in ketoTarifModel
}
}.onAppear() {
self.ketoModel.fetchData()
self.ketoTarifModel.fetchData()
}
}
}
主要思想是Keto有一个字符串(早餐),该字符串应该与Keotarif中的名称匹配。
我刚从关系数据库切换过来,有一个问题把我的注意力放在了这个问题上
谢谢 首先,谢谢你提出的好问题。提供所有代码,问题明确。喜欢它 然后,有两种可能性,这取决于用例。有多个匹配项还是只有一个匹配项?无论如何下面的代码应该可以,并且正在Xcode版本12.4(12D4e)中编译:
注意:For-in-For-loop对于大型数据集来说可能是一个难题。我走的方向非常错误。非常感谢你的回答!
struct ContentView: View {
@ObservedObject var ketoModel = KetoViewModel()
@ObservedObject var ketoTarifModel = KetoTarifViewModel()
var body: some View {
ScrollView {
Text("c")
ForEach(ketoModel.ketoDays) { keto in
// get the first element that satisfies your needs
if let firstKetoTarifModel = ketoTarifModel.ketoTarifler.first(where: {$0.name == keto.breakfast}) {
Text(firstKetoTarifModel.name)
}
// get multiple elements
ForEach(ketoTarifModel.ketoTarifler) { ketoTarifler in
if ketoTarifler.name == keto.breakfast {
Text(ketoTarifler.name)
}
}
//here keto.breakfast returns a string
// and I want to search/find/print that string in ketoTarifModel
}
}.onAppear() {
self.ketoModel.fetchData()
self.ketoTarifModel.fetchData()
}
}
}