2017-10-12 60 views
1

我在firebase中有三个节点,我想通过使用相同的循环来循环。我能够成功地遍历单个节点使用此代码(饼干):如何在同一个循环中一次循环所有Firebase子项?

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) 
     } 

    } 

})

我现在想循环剩下的两个节点为好。有任何想法吗?

我试着添加额外的节点,但控制台中的打印显示它只从最后一个节点添加。请参阅以下代码:

 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

您可以嵌入在观察到对方。例如,类似这样的东西:databaseRef.child(“cookies”)。observeSingleEvent(of:.value,with:{(snapshot)in databaseRef.child(“secondNode”)。observeSingleEvent(of:.value,with:{快照)in ...等等。这在技术上不是一个循环,而是数据访问一个接一个地发生 –

+0

谢谢,但我在控制台中做了一个打印,它似乎只是从最后一个节点添加,忽略了前两个列出...更新我的帖子上面:)你能看到缺少的东西吗? –

+0

是的,因为打印只能在最深层次上调用...所以尝试这样的事情:self.databaseRef.child(“cookies”)。observeSingleEvent(的:.value的,具有:{(cookiesSnapshot)在 \t \t打印( “曲奇:\(cookiesSnapshot)”) \t \t self.databaseRef.child( “甜点”)observeSingleEvent(的:。价值,具有:{ (dessertSn apshot)在 \t \t \t打印( “甜点:\(dessertSnapshot)”) \t \t \t self.databaseRef.child( “早餐”)observeSingleEvent(作者:.value的,有:{(breakfastSnapshot)在 \t \t \t print(“早餐:\(早餐快照)”) –

回答

0

以下代码打印所有三级快照。我希望这会有所帮助:

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)") 
     }) 
    }) 
}) 

我不能检查这个,所以我希望所有的}和)在正确的地方。 :)

0

你可以通过字典转换快照快译通和循环:

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) 
      ... 
      } 
     } 
    } 
} 

,或者您可以使用枚举:

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

感谢所有的快速回复!我会尝试一下,并在我尝试过之后再回来! :) –