Swift Как получить данные из firebase перед загрузкой страницы - PullRequest
0 голосов
/ 20 июня 2020

У меня есть этот код firebase.

self.db.collection("ustas").getDocuments(){ (querysnapshot,err) in
         for document in querysnapshot!.documents {

         }                
}

Здесь я в основном получаю все документы из коллекции ustas. Теперь мне нужно представить его в виде списка. Я попробовал, сначала создав функцию перед телом и присвоив все значения переменной, а затем повторяя эту переменную. Примерно так:

@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{
                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 голосов
/ 20 июня 2020

getUstalar - асинхронная c функция, поэтому она не может возвращать значения синхронно с 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()
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...