Swift如何在页面加载之前从Firebase获取数据

时间:2020-06-20 15:39:22

标签: swift firebase

我有这个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中正确执行此操作?

1 个答案:

答案 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()
   }
}