Recuperar ID secundario generado random de Firebase

Tengo Firebase generando keys aleatorias para mis loggings en una aplicación Swift. ¿Cómo voy a recuperar esa key si quiero cambiar un logging específico? En el siguiente ejemplo, estoy marcando una tarea completa, pero cuando presiono el button no funciona según lo previsto porque no estoy haciendo reference a la tarea en particular, pero para hacer reference a la tarea necesito la key generada aleatoriamente.

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

Mi estructura de Firebase:

  1. Tareas
    • ID generada aleatoriamente
      • título:
      • descripción:
    • ID generada aleatoriamente
      • título:
      • descripción:

Actualización 1:

He actualizado mi código para get las ID de todas las tareas, pero la funcionalidad de actualizar el backend no funciona correctamente. Solo permite actualizar las tareas creadas en la aplicación. Hay 150 tareas que he importado utilizando el Panel de control web. Esos son los que no puedo actualizar.

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

Para crear una key generada aleatoriamente, debe usar childByAutoId() (que no veo en su código de ejemplo).
Esto devolverá una reference de Firebase que podría usar y que devolverá la key con su propiedad .key

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

Consulte la documentation aquí

Siguiendo la respuesta de Tim para Swift 3 y Firebase 4, tuve que usar el siguiente

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