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

问题描述 投票:0回答:2

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

我试图弄清楚为什么我无法访问从Firestore发出的数组值。下面的类从Firestore读取数据并填充数组数据:[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)

    }
}

但是当我从View(下面的代码)调用数组时,出现此错误:

“线程1:致命错误:索引超出范围”

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

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

我不明白为什么我不能进入ContentView却可以从getCategoriesData访问数组。

感谢您的回答吉恩

我是新来的,正在学习如何使用SwiftUi进行编码,我试图弄清为什么我无法访问从Firestore发出的数组值。下面的类从Firestore读取数据并填充一个...

arrays firebase google-cloud-firestore swiftui fatal-error
2个回答
0
投票

之所以无法从getCategoriesData访问数组,是因为“ db.collection(” categories“)。addSnapshotListener {(snap,err)in”是一个异步函数。也就是说,它的结果(以及因此的init())是在完成之前不可用。研究更多有关异步函数及其调用位置的信息,通常不在init()中。


0
投票

感谢此代码,我知道如何处理从Firestore进行的异步检索:

© www.soinside.com 2019 - 2024. All rights reserved.