如何使用Swift正确观察两个join的Firebase节点

这个问题跟随这个问题: join不同的节点,用firebase一次观察它们 。 我很抱歉,如果它非常相似,但我正在努力解决它在我的项目。

我有一个成分数据 ,它获得了几个成分和一个属性:

{ "IngredientData": { "-KkY92MUZNHXxg4ivGY7": { "name": "Onions" }, "-KkY90e7dAgefc8zH3_F": { "name": "Peas" }, "-KkY9-HWJANdfhmD-SJ-": { "name": "Mushrooms" }, "-KkbWdomTYdpgEDLjC9w": { "name": "Eggs" }, "-KkbXOECSCBNAcVaO9rp": { "name": "Rice" } } } 

然后我有一个食谱数据 ,其中包含食谱和里面,这是成分

 { "RecipeData": { "-KlApwz5Y-TK_9z1sV1i": { "recipeName": "Fried Rice", "ingredients": { "-KkbWdomTYdpgEDLjC9w": true, "-KkbXOECSCBNAcVaO9rp": true, "-KkY90e7dAgefc8zH3_F": true } } } } 

我现在正在尝试获取配方中的配料的细节,所以我可以得到名称属性。 我有一个函数在食谱的成分里面迭代:

 func fetchRecipeIngredients() { let databaseRef = FIRDatabase.database().reference().child("RecipeData/recipe/-KlApwz5Y-TK_9z1sV1i/ingredients") databaseRef.observeSingleEvent(of: FIRDataEventType.value, with: { snapshot in for ingredients in snapshot.children { print(snapshot) } }) } 

这是我的Recipe类:

 class Recipe { var name: String! var key: String init(from snapshot: FIRDataSnapshot) { let snapshotValue = snapshot.value as! [String: Any] self.name = snapshotValue["recipeName"] as! String self.key = snapshot.key } } 

我有两个主要问题:

  1. 首先,目前我不知道如何迭代一个特定的配方,或者如果这是我想要实现的必要条件。 现在我已经对recipeID进行了硬编码,以便能够在其中进行迭代。

  2. 如何使用此fetchRecipeIngredients()获取成分的详细信息

提前致谢 :)

干得好。

从Firebase结构开始

 { "IngredientData" : { "ingredient_0" : { "name" : "Onions" }, "ingredient_1" : { "name" : "Peas" }, "ingredient_2" : { "name" : "Mushrooms" }, "ingredient_3" : { "name" : "Tomatoes" }, "ingredient_4" : { "name" : "Dough" } }, "RecipeData" : { "recipe_0" : { "ingredients" : { "ingredient_0" : true, "ingredient_1" : true, "ingredient_2" : true }, "name" : "Fried Rice" }, "recipe_1" : { "ingredients" : { "ingredient_0" : true, "ingredient_2" : true, "ingredient_3" : true, "ingredient_4" : true }, "name" : "Pizza" } } } 

这与你的相似

我们有一个主要的function,加载在一个特定的配方,然后加载成分的function。

  func loadRecipe() { let recipiesRef = self.ref.child("RecipeData") let recipieToLoadRef = recipiesRef.child("recipe_1") recipieToLoadRef.observeSingleEvent(of: .value, with: { snapshot in let recipieDict = snapshot.value as! [String:Any] let name = recipieDict["name"] as! String let ingredientsSnap = snapshot.childSnapshot(forPath: "ingredients") print(name) self.loadIngredients(ingredientSnap: ingredientsSnap) }) } func loadIngredients(ingredientSnap: DataSnapshot) { let ingredientsRef = self.ref.child("IngredientData") for ingredient in ingredientSnap.children { let snap = ingredient as! DataSnapshot let ingredientKey = snap.key let thisIngredient = ingredientsRef.child(ingredientKey) thisIngredient.observeSingleEvent(of: .value, with: { snapshot in let ingredientDict = snapshot.value as! [String: Any] let ingredientName = ingredientDict["name"] as! String print(" \(ingredientName)") }) } } } 

和输出

 Pizza Onions Mushrooms Tomatoes Dough 

编辑

作为对后续评论的回应:

如果您的用户想要存储他们的collections夹,那么创build一个节点

 favorites recipe_1: true recipe_2: true 

通过.value观察/ favorites节点(它将一次读取所有的collections夹,迭代快照中的子节点,这些键将是配方节点名称(recipe_1和recipe_2)。该节点直接(/ recipe_1 /名称),并填充一个数组,您可以使用作为tableView的数据源