Je suis nouveau ici et j'apprends à coder avec SwiftUi

J'essaie de comprendre pourquoi je ne peux pas accéder à mes valeurs de tableau issues de Firestore. La classe ci-dessous lit les données de Firestore et remplit un tableau de données: [category], où category est une structure.

Le tableau semble être bien rempli car lorsque j'imprime les valeurs de ce tableau, il apparaît dans la console.

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)

    }
}

Mais lorsque j'appelle mon tableau à partir de ma vue (code ci-dessous), j'obtiens cette erreur:

"Thread 1: Fatal error: Index out of range"

Il semble que le tableau ne soit pas reconnu dans la vue.

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

Je ne comprends pas pourquoi je peux accéder à mon tableau à partir de getCategoriesData alors que je ne peux pas dans mon ContentView.

Merci pour vos réponses Jean

0
jean 26 avril 2020 à 00:51

2 réponses

Meilleure réponse

La raison pour laquelle vous ne pouvez pas accéder à votre tableau à partir de getCategoriesData est que "db.collection (" categories "). addSnapshotListener {(snap, err) in" est une fonction asynchrone. Autrement dit, les résultats de celui-ci (et donc init ()) ne sont pas disponibles tant qu'il n'est pas terminé. Étudiez un peu plus les fonctions asynchrones et où les appeler, généralement pas dans init ().

0
workingdog 25 avril 2020 à 23:39

J'ai compris comment gérer la récupération asynchrone de Firestore grâce à ce code:

if self.categories.datas.isEmpty {
                Text("")

            } else {
                Text(self.categories.datas[1].name)
            }
0
jean 26 avril 2020 à 00:10