【问题标题】:SwiftUI, Firestore getting one collection and matching with anotherSwiftUI,Firestore 获取一个集合并与另一个集合匹配
【发布时间】: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 中的名称匹配。 我刚从关系数据库切换,并在考虑这个问题时遇到了问题。

谢谢!

【问题讨论】:

    标签: swift firebase google-cloud-firestore swiftui


    【解决方案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 循环可能会很痛苦。
    • 我走错了方向。非常感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多