从Firebase中检索随机生成的儿童ID

我有Firebase在Swift应用程序中为我的logging生成随机密钥。 如果我想更改特定的logging,如何获取该密钥? 在我下面的例子中,我标记了一个任务完成,但是当我点击button时,它不能按预期工作,因为我没有引用特定的任务,而是引用任务,我需要随机生成的密钥。

func doneHit(cell:TaskCell) { if let ip = tableView.indexPathForCell(cell) { var task = tasksInSectionArray[ip.section][ip.row] let tasksRef = ref.childByAppendingPath("tasks") ref.observeSingleEventOfType(.Value, withBlock: { snapshot in let doneRef = tasksRef.childByAppendingPath("\(snapshot.key)/done") if task.done == false { task.done = true cell.checkBox.image = UIImage(named: "checkedbox") doneRef.setValue(task.done) } else { task.done = false cell.checkBox.image = UIImage(named: "uncheckedbox") doneRef.setValue(task.done) } let completedByRef = tasksRef.childByAppendingPath("\(snapshot.key)/completedBy") if task.done == true { completedByRef.setValue(self.user) cell.detailLabel.text = "Completed By: \(self.user)" } else { completedByRef.setValue("") cell.detailLabel.text = "" } }) } } 

我的Firebase结构:

  1. 任务
    • 随机生成的ID
      • 标题:
      • 描述:
    • 随机生成的ID
      • 标题:
      • 描述:

更新1:

我更新了我的代码以获取所有任务的ID,但更新后端的function无法正常工作。 它只是让更新应用程序中创build的任务。 我使用Web Dashboard导入了150个任务。 那些是我无法更新的。

 func doneHit(cell:TaskCell) { if let ip = tableView.indexPathForCell(cell) { var task = tasksInSectionArray[ip.section][ip.row] let tasksRef = ref.childByAppendingPath("tasks") var taskID = "" tasksRef.observeSingleEventOfType(.Value, withBlock: { snapshot in for task in snapshot.children { let _tasks = task as! FDataSnapshot let id = _tasks.key print(id) taskID = id } let doneRef = tasksRef.childByAppendingPath("\(taskID)/done") if task.done == false { task.done = true cell.checkBox.image = UIImage(named: "checkedbox") doneRef.setValue(task.done) } else { task.done = false cell.checkBox.image = UIImage(named: "uncheckedbox") doneRef.setValue(task.done) } let completedByRef = tasksRef.childByAppendingPath("\(taskID)/completedBy") if task.done == true { completedByRef.setValue(self.user) cell.detailLabel.text = "Completed By: \(self.user)" } else { completedByRef.setValue("") cell.detailLabel.text = "" } }) } } 

 tasksRef.observeSingleEventOfType(.Value, withBlock: { snapshot in for task in snapshot.children { guard let taskSnapshot = task as? FDataSnapshot else { continue } let id = task.key // do other things } } 

要创build一个随机生成的密钥,你需要使用childByAutoId() (我不能在你的示例代码中看到)。
这将返回一个您可以使用的Firebase参考,并且将返回具有.key属性的密钥

 var post1Ref = ref.childByAutoId() post1Ref.setValue(post1) var postId = post1Ref.key 

在这里看文档

在Tim对Swift 3和Firebase 4的回答之后,我不得不使用下面的内容

 for task in snapshot.children { guard let taskSnapshot = task as? DataSnapshot else { continue } let id = taskSnapshot.key