这个问题是从这个开始的:Join different nodes to observe them at once with firebase .如果它非常相似,我深表歉意,但我正在努力在我的项目中解决它。
我有一个IngredientData,它获得了几种成分和一个属性:
{
"IngredientData": {
"-KkY92MUZNHXxg4ivGY7": {
"name": "Onions"
},
"-KkY90e7dAgefc8zH3_F": {
"name": "Peas"
},
"-KkY9-HWJANdfhmD-SJ-": {
"name": "Mushrooms"
},
"-KkbWdomTYdpgEDLjC9w": {
"name": "Eggs"
},
"-KkbXOECSCBNAcVaO9rp": {
"name": "Rice"
}
}
}
然后我有一个RecipeData,其中包含食谱,里面是成分。
{
"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"
}
}
}
这和你的很像
我们有一个加载特定配方的主要功能,然后是一个加载配料的功能。
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
编辑
回应后续评论:
如果您的用户想要存储他们的收藏夹,那么创建一个节点
favorites
recipe_1: true
recipe_2: true
通过 .value 观察/favorites 节点(这将立即读取他们所有的收藏夹。迭代快照中的子项。键将是配方节点名称(recipe_1 和 recipe_2)。然后您可以加载每个直接从节点 (/recipe_1/name) 获取配方名称并填充一个数组,您可以将其用作 tableView 的数据源
关于ios - 如何使用 Swift 使用 Firebase 正确观察两个连接的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44230692/