【问题标题】:SwiftUI - Simple Firestore Query - Display ResultsSwiftUI - 简单的 Firestore 查询 - 显示结果
【发布时间】:2023-04-07 21:15:01
【问题描述】:

好的,我会以我是 SwiftUI 和编程新手的事实作为开头。我是一名用户体验设计师。但是,我正在尝试运行一个简单的 Firestore 查询并将结果返回到一个列表中。

我已经能够编写一个将结果成功写入控制台的函数,但我不知道如何访问函数中的信息,以便我可以在页面的主视图中使用它。

我创建了一个简单的视图,这样我就可以专注于在列表中显示 Firestore 数据。这是我目前的准系统代码。

import SwiftUI
import FirebaseFirestore

struct FestivalListFB: View {

    let db = Firestore.firestore()

    func getVenues() {
        let db = Firestore.firestore()
        db.collectionGroup("Venues").getDocuments() {(querySnapshot, err) in
            if let err = err {
                print("Error getting documents \(err)")
            } else {
                for document in querySnapshot!.documents {
                    guard let venueEntry = document.get("venueTitle") as? String else {
                        continue
                    }
                    print(venueEntry) 
                }
            }
        }
    }



    var body: some View {
        VStack {
            List(0 ..<5) { item in
                Text("Hello, World!")
            }
        }.onAppear(perform: getVenues)
    }
}

控制台显示:

“茶点前哨 节日糖果和零食 法夫鼓酒馆 L'Artisan des Glaces 石华素 ...等”

当然,body 在一个列表中只显示 5 次“Hello World”。我将如何访问“venueEntry”中的值以便可以在列表元素中显示它?

我还包含了我的 Firestore 数据结构的图像。理想情况下,我想显示按它们所在的“venueArea”分组的场所。

【问题讨论】:

    标签: firebase google-cloud-firestore swiftui


    【解决方案1】:

    为了方便使用,我为您的场地创建了一个模型。请参阅下面的 sn-p 如何在视图中显示数据。

    你的模型:

    class VenueObject: ObservableObject {
        @Published var venueID: String
        @Published var venueTitle: String
        @Published var venueArea: String
    
        init(id: String, title: String, area: String) {
            venueID = id
            venueTitle = title
            venueArea = area
        }
    }
    

    您的看法:

    struct FestivalListFB: View {
    
        @State var data: [VenueObject] = []
    
        let db = Firestore.firestore()
    
        var body: some View {
            VStack {
                ForEach((self.data), id: \.self.venueID) { item in
                    Text("\(item.venueTitle)")
                }
            }.onAppear {
                self.getVenues()
            }
        }
    
        func getVenues() {
            // Remove previously data to prevent duplicate data
            self.data.removeAll()
            self.db.collectionGroup("Venues").getDocuments() {(querySnapshot, err) in
                if let err = err {
                    print("Error getting documents \(err)")
                } else {
                    for document in querySnapshot!.documents {
                        let id = document.documentID
                        let title = document.get("venueTitle") as! String
                        let area = document.get("venueArea") as! String
    
                        self.data.append(VenueObject(id: id, title: title, area: area))
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 感谢 Tobias,这对我的理解有很大帮助。
    • 我将如何避免追加?我注意到每次加载视图时,它都会在初始结果下方添加另一个结果迭代?
    • @Jason 您唯一需要做的就是在开始获取数据时 removeAll() 。因此,首先清空您的数据数组,然后附加来自 firebase 的所有内容。这将确保您的数据只显示一次:-)
    • 非常感谢@TobiasHesselink!我已经从 firestore 中看到了很多关于如何使用 get.Documents() 的解释,但一直在努力寻找一个不会被存储库等带走的简单示例。我知道所有这些额外的东西都很重要,我很快就会继续这样做,但是当你学习时,坚持基础并开始运行是很好的。
    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多