SwiftUI,Firestore 获取一个集合并与另一个集合匹配
Posted
技术标签:
【中文标题】SwiftUI,Firestore 获取一个集合并与另一个集合匹配【英文标题】:SwiftUI, Firestore getting one collection and matching with another 【发布时间】:2021-03-25 08:22:09 【问题描述】:我很困惑将一个集合链接到另一个集合,任何反馈都将不胜感激。 我必须将它们编码为结构的集合:
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 有一个字符串(早餐),它应该与 KetoTarif 中的名称匹配。 我刚从关系数据库切换,并在考虑这个问题时遇到了问题。
谢谢!
【问题讨论】:
【参考方案1】:首先,让我感谢您提出的好问题。提供的所有代码,明确的问题。爱它!
然后,您有两种可能取决于用例。有多个匹配项还是只有一个匹配项?无论如何。下面的代码应该在 Xcode 版本 12.4 (12D4e) 中编译:
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()
【讨论】:
注意:对于大型数据集,for 循环中的 for 循环可能会很痛苦。 我走错了方向。非常感谢您的回答!以上是关于SwiftUI,Firestore 获取一个集合并与另一个集合匹配的主要内容,如果未能解决你的问题,请参考以下文章
使用 SwiftUI 从 Cloud Firestore 中的集合“配置文件”中获取数据。无法将类型“[String:Any]”的值分配给类型“UserProfile”
SwiftUI Lists + Firebase Firestore,获取数据然后取消获取? (漏洞)
如何从firestore中检索swiftUI中的预定义项目列表?
如何通过 Desc SwiftUI 对 Cloud Firestore 数据进行排序