SwiftUi:从 Firestore 发出的数组的索引超出范围

SwiftUi : Index out of range on an Array issued from Firestore

我是新来的,正在学习如何使用 SwiftUi 编码

我想弄清楚为什么我无法访问从 Firestore 发出的数组值。 下面的 class 从 Firestore 中读取数据并填充一个数组 datas: [category],其中 category 是一个结构。

数组似乎已填满,因为当我打印此数组的值时,它会出现在控制台中。

class getCategoriesData: ObservableObject {

@Published var datas = [category]()

init() {
    let db = Firestore.firestore()

    db.collection("categories").addSnapshotListener { (snap, err) in

        if err != nil {

            print((err?.localizedDescription)!)
            return
        }

        for i in snap!.documentChanges {
            let id = i.document.documentID
            let name = i.document.get("name") as! String
            let pic = i.document.get("pic") as! String

            self.datas.append(category(id: id, name: name, pic: pic))
        }

        //try inside getCategoriesData
        print(self.datas)
        print(self.datas[1])
        print(self.datas[1].name)

    }
}

但是当我从我的视图(下面的代码)调用我的数组时,我得到这个错误:

"Thread 1: Fatal error: Index out of range"

视图中似乎无法识别该数组。

struct ContentView: View {

@State private var searchText: String = ""
@ObservedObject var categories = getCategoriesData()

var body: some View {

    VStack {

        Text(categories.datas[1].name) //here the error appears

我不明白为什么我可以从 getCategoriesData 访问我的数组,而我不能进入我的 ContentView..

感谢您的回答 让

您无法从 getCategoriesData 访问数组的原因是 "db.collection("categories").addSnapshotListener { (snap, err) in" 是一个异步函数。也就是说,它的结果(以及因此 init())是 在完成之前不可用。进一步研究异步函数以及调用它们的位置,通常不在 init() 中。

感谢这段代码,我想出了如何处理从 Firestore 异步检索的方法:

if self.categories.datas.isEmpty {
                Text("")

            } else {
                Text(self.categories.datas[1].name)
            }