我是新来的,正在学习如何使用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读取数据并填充一个...
之所以无法从getCategoriesData访问数组,是因为“ db.collection(” categories“)。addSnapshotListener {(snap,err)in”是一个异步函数。也就是说,它的结果(以及因此的init())是在完成之前不可用。研究更多有关异步函数及其调用位置的信息,通常不在init()中。
感谢此代码,我知道如何处理从Firestore进行的异步检索: