如何使用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 } }
我有两个主要问题:
-
首先,目前我不知道如何迭代一个特定的配方,或者如果这是我想要实现的必要条件。 现在我已经对recipeID进行了硬编码,以便能够在其中进行迭代。
-
如何使用此
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的数据源