我有这个firebase代码。
self.db.collection("ustas").getDocuments(){ (querysnapshot,err) in
for document in querysnapshot!.documents {
}
}
这里,我基本上从ustas
集合中获取了所有文档。现在,我必须在列表视图中呈现它。我尝试过,首先在body之前创建一个函数,然后将所有值辅助为一个变量,然后迭代该变量。像这样:
@State var ustasList: Array<Usta> = []
func getUstalar() -> Array<Usta>{
var templist: Array<Usta> = []
DispatchQueue.main.async {
self.db.collection("ustas").getDocuments(){ (querysnapshot,err) in
for document in querysnapshot!.documents {
let data = document.data()
let newUsta = Usta(id: UUID(), name: data["name"] as! String, type: data["type"] as! String,telephone: data["telephone"] as! String)
templist.append(newUsta)
}
}
}
return templist
}
var body: some View {
NavigationView{
List{
ForEach(0..<self.ustasList.count){ i in
Text(self.ustasList[i].name)
}
}
}
.onAppear(){
self.ustasList = self.getUstalar()
}
}
但是它没有用,因为return templist
在getDocuments()可以执行之前就执行了。然后,我尝试将firebase代码放入List内,如下所示:
List{
self.db.collection("ustas").getDocuments(){ (querysnapshot,err) in
for document in querysnapshot!.documents {
let data = document.data()
Text(data["name"])
}
}
}
但是它给了我Type 'Void' cannot conform to 'View'; only struct/enum/class types can conform to protocols
。如何在Swift中正确执行此操作?
答案 0 :(得分:0)
getUstalar
是一个异步函数,因此它无法与self.ustasList = self.getUstalar()
同步返回值-这只会返回[]
将元素直接添加到self.ustasList
的完成处理程序内的getDocuments
中:
@State var ustasList: [Usta] = []
func getUstalar() {
self.db.collection("ustas").getDocuments(){ (querysnapshot,err) in
for document in querysnapshot!.documents {
let data = document.data()
let newUsta = Usta(id: UUID(), name: data["name"] as! String, type: data["type"] as! String,telephone: data["telephone"] as! String)
self.ustasList.append(newUsta) // populate the list
}
}
}
并在.onAppear
中调用此函数-它将填充列表:
var body: some Body {
NavigationView {
// ...
}.onAppear(){
self.getUstalar()
}
}