ios - 如何使用 Swift 使用 Firebase 正确观察两个连接的节点

标签 ios swift firebase firebase-realtime-database

这个问题是从这个开始的: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
    }
}

我有两个主要问题:

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

这和你的很像

我们有一个加载特定配方的主要功能,然后是一个加载配料的功能。

   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/

相关文章:

ios - 初学者 Firebase 用户 FCM 设置问题

ios - 我可以使用具有不同 UIview 类的水平 ScrollView 而不是 UINavigationController 来导航到不同的 View Controller 吗

ios - 如何改变旋钮的旋转角度? iOS

swift - 为什么将 Double 转换为 Int 不会在 Swift 中返回可选的 Int?

ios - 在 try catch 中分解 catch 子句

swift - 我无法弄清楚这个 switch 语句是如何工作的?

iOS - 重复符号 Google Core 和 Firebase 性能

javascript - 如何修复 React Native 中的 'undefined is not an object' 错误

iOS UIView 推送 View Controller

ios - 将 Microsoft Team Foundation Server 集成到 iOS 应用程序中的推荐方法是什么