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)
}
我是新来的,正在学习如何使用 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)
}