SwiftUI - 简单的 Firestore 查询 - 显示结果

Jas*_*ain 0 firebase google-cloud-firestore swiftui

好的,我先介绍一下我是 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台显示:

“Reshment Outpost Holiday Sweets & Treats Fife & Drum Tavern L'Artisan des Glaces Shi Wasu ...等”

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

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

在此处输入图片说明

Tob*_*ink 5

为了更容易使用,我为您的场地创建了一个模型。请参阅以下代码段,了解如何在视图中显示数据。

您的型号:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

您的观点:

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))
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)