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 数据进行排序

SwiftUI:如何阅读 Firestore 中的特定文档?

SwiftUI+Firestore 中的多选列表