2017-10-12 1 views
1

J'ai trois nœuds dans Firebase que je voudrais boucler en utilisant la même boucle. Je suis capable de réussir une boucle à travers un seul nœud (cookies) en utilisant ce code:Comment faire pour boucler tous les enfants Firebase en même temps dans la même boucle?

databaseRef.child("cookies").observeSingleEvent(of: .value, with: {(snapshot) in 
     for item in snapshot.children.allObjects as! [DataSnapshot] { 
      let thisItem = item.value as! NSDictionary 

      if(favoriteArray.contains(item.key)) { 

      self.numberOfRecipes.append(thisItem["recipeHeaderFirebase"] as! String) 

      let tempRecipe = Recipe() 
      tempRecipe.fbKey = item.key 
      tempRecipe.recipeHeaderObject = (thisItem["recipeHeaderFirebase"] as! String) 
      tempRecipe.recipeTextObject = (thisItem["recipeIngredientsTextFirebase"] as! String) 
      tempRecipe.recipeImageObject = (thisItem["recipeImageFirebase"] as! String) 

      self.recipeClassArray.append(tempRecipe) 
     } 

    } 

})

Je voudrais maintenant boucler les deux nœuds restants ainsi. Des idées?

J'ai essayé d'ajouter des noeuds supplémentaires, mais une impression dans la console indique qu'elle n'a été ajoutée qu'à partir du dernier noeud. Voir le code ci-dessous:

 self.databaseRef.child("cookies").observeSingleEvent(of: .value, with: {(snapshot) in 
     self.databaseRef.child("dessert").observeSingleEvent(of: .value, with: {(snapshot) in self.databaseRef.child("breakfast").observeSingleEvent(of: .value, with: {(snapshot) in 
     for item in snapshot.children.allObjects as! [DataSnapshot] { 
      let thisItem = item.value as! NSDictionary 

      if(favoriteArray.contains(item.key)) { 

      self.numberOfRecipes.append(thisItem["recipeHeaderFirebase"] as! String) 

      let tempRecipe = Recipe() 
      tempRecipe.fbKey = item.key 
      tempRecipe.recipeHeaderObject = (thisItem["recipeHeaderFirebase"] as! String) 
      tempRecipe.recipeTextObject = (thisItem["recipeIngredientsTextFirebase"] as! String) 
      tempRecipe.recipeImageObject = (thisItem["recipeImageFirebase"] as! String) 

      self.recipeClassArray.append(tempRecipe) 
     } 

    } 
     print(self.numberOfRecipes.count) 
      print(self.recipeClassArray) 

      let url = URL(string: self.recipeClassArray[self.currentView].recipeImageObject) 
      self.recipeImageUI.kf.setImage(with: url)   //SÄTTER IN BILD MED KINGFISHER 

      self.recipeHeader.text = self.recipeClassArray[self.currentView].recipeHeaderObject //SÄTTER IN HEADER 

      self.ingredientText.text = self.recipeClassArray[self.currentView].recipeTextObject //SÄTTER IN TEXTEN 


      self.animateFunc(image: self.recipeImageUI, labelHeader: self.recipeHeader, labelText: self.ingredientText) //FUNKTION FÖR ATT ANIMERA  
    }) 

    }) 
    }) 
+0

Vous pouvez intégrer le fait observer dans l'autre. Par exemple, quelque chose comme ça: databaseRef.child ("cookies"). ObserveSingleEvent (de: .value, avec: {(snapshot) dans databaseRef.child ("secondNode"). ObserveSingleEvent (de: .value, avec: {(instantané) dans ... et ainsi de suite.Ce n'est techniquement pas une boucle, mais l'accès aux données se passe l'un après l'autre –

+0

Merci, mais j'ai fait une impression dans la console et il semble seulement ajouter du dernier noeud, en ignorant les deux premiers listé ... Mise à jour de mon post ci-dessus :) Pouvez-vous voir ce qui manque? –

+0

Oui, parce que l'impression n'a appelé qu'au niveau le plus profond ... alors essayez quelque chose comme ça: self.databaseRef.child ("cookies"). observerSingleEvent (de: .value, avec: {(cookiesSnapshot) dans \t \t print ("les cookies: \ (cookiesSnapshot)") \t \t self.databaseRef.child ("dessert") observeSingleEvent (de:. .value, avec: { (dessertSn apshot) dans \t \t \t print ("dessert: \ (dessertSnapshot)") \t \t \t self.databaseRef.child (. "du petit déjeuner") observeSingleEvent (de: .value, avec: {(breakfastSnapshot) dans \t \t \t imprimer ("petit-déjeuner: \ (breakfastSnapshot)") –

Répondre

0

Le code suivant imprime les trois niveaux d'instantanés. J'espère que cela vous aidera:

self.databaseRef.child("cookies").observeSingleEvent(of: .value, with: { (cookiesSnapshot) in 
    print("cookies snapshot: \(cookiesSnapshot)") 

    self.databaseRef.child("dessert").observeSingleEvent(of: .value, with: { (dessertSnapshot) in 
     print("dessert snapshot: \(dessertSnapshot)") 

     self.databaseRef.child("breakfast").observeSingleEvent(of: .value, with: { (breakfastSnapshot) in 
      print("breakfast snapshot: \(breakfastSnapshot)") 
     }) 
    }) 
}) 

Je ne peux pas vérifier, donc j'espère que tous les}) dans le bon endroit. :)

0

Vous pouvez convertir instantané à dict et boucle à travers le dict:

databaseRef.child("cookies").observeSingleEvent(of: .value, with: { snapshot in 
    if let dict = snapshot.value as? Dictionary<String, Dictionary<String, Any>> { 
     for (key, value) in dict { 
      if let recipeHeader = value["recipeHeaderFirebase"] as? String, favoriteArray.contains(key) { 
       self.numberOfRecipes.append(recipeHeader) 
      ... 
      } 
     } 
    } 
} 

ou vous pouvez utiliser le recenseur:

databaseRef.child("cookies").observeSingleEvent(of: .value, with: { snapshot in 
    let enumerator = snapshot.children 
    while let (key, value) = enumerator.nextObject() as? FIRDataSnapshot { 
     if let recipeHeader = value["recipeHeaderFirebase"] as? String, favoriteArray.contains(key) { 
      self.numberOfRecipes.append(recipeHeader) 
      ... 
     } 
    } 
} 
+0

Merci pour toutes les réponses rapides! Je vais les essayer et revenir quand je les ai essayés! :) –