iOS – Firebase Observa el evento único llamando dos veces

Soy relativamente nuevo en el desarrollo de Firebase y iOS, así que esperaba que alguien me diera alguna orientación sobre lo que estoy haciendo mal. Por alguna razón, el bloque de código dentro de mi Observe se ejecuta dos veces, aunque ObserveSingleEvent se supone que debe terminar la observación después de leer los datos iniciales.

Algo que quiero tener en count es que esto solo ocurre en mi teléfono (iPhone 7 iOS10). Tengo un problema totalmente diferente cuando lo ejecuto en el simulador, recibo una llamada como se supone que debe hacerlo; sin embargo, la llamada se realiza mientras mi vista todavía está en la vista anterior. Esencialmente, esta function debe llamarse después de que la pantalla principal cargue su vista. Sin embargo, en el simulador, cuando autentico a mi usuario en la pantalla de inicio de session, crea la window emergente si no tengo un nombre de usuario, y en realidad no presenta la siguiente vista en la pantalla principal.

Aquí está la function que causa problemas:

func initialSetUp() { print("initially set up") let userRef = FIRDatabase.database().reference(withPath: "/users/").child("\(uid!)") userRef.observeSingleEvent(of: .value, with: { (snapshot) in print("observing event") print("\(snapshot)") if snapshot.hasChild("username"){ print("user has username") } else { print("user does not have username") //do stuff let nameRef = FIRDatabase.database().reference(withPath: "/usernames/") let alert = SCLAlertView() let appearance = SCLAlertView.SCLAppearance( kTitleFont: UIFont(name: "Futura-Medium", size: 20)!, kTextFont: UIFont(name: "Futura-Medium", size: 14)!, kButtonFont: UIFont(name: "Futura-Bold", size: 14)!, showCloseButton: false, shouldAutoDismiss: false ) alert.appearance = appearance let newName = alert.addTextField("Enter your name") alert.addButton("Check name", backgroundColor: UIColor.black, textColor: UIColor.white, showDurationStatus: false) { UIApplication.shanetworking.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil) if let name = newName.text { if name != "" { //check if username is unique nameRef.child(name.lowercased()).observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in print("\(snapshot.value)") if !snapshot.exists() { let alertView = SCLAlertView() alertView.showSuccess("Woohoo!", subTitle: "This username is valid!") print("valid username") } else { let alertView = SCLAlertView() alertView.showError("Sorry :(", subTitle: "This username has already been taken.") } }) } else { let alertView = SCLAlertView() alertView.showError("Sorry :(", subTitle: "Your name can't be blank!") } } } alert.addButton("Done", backgroundColor: UIColor.black, textColor: UIColor.white, showDurationStatus: false) { UIApplication.shanetworking.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil) if let name = newName.text { if name != "" { //check if username is unique nameRef.child(name.lowercased()).observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in print("\(snapshot.value)") if !snapshot.exists() { alert.hideView() let alertView = SCLAlertView() alertView.showSuccess("Success!", subTitle: "You're all set to go!") userRef.child("username").setValue(name) nameRef.updateChildValues([name.lowercased(): self.uid]) } else { let alertView = SCLAlertView() alertView.showError("Sorry :(", subTitle: "This username has already been taken.") } }) } else { let alertView = SCLAlertView() alertView.showError("Sorry :(", subTitle: "Your name can't be blank!") } } } alert.showCustom("Username", subTitle: "Please pick a user name!", color: UIColor.black, icon: SCLAlertViewStyleKit.imageOfEdit) } }) } 

Aquí está mi vista

 override func viewDidLoad() { self.view.addSubview(self.mapViewController.view) self.view.addSubview(self.tableController.view) print("View did load") uid = (FIRAuth.auth()?.currentUser?.uid)! locationsRef = FIRDatabase.database().reference(withPath: "/users/").child("\(uid)").child("locations") initialSetUp() } 

El resultado que recibo se ve algo así

 View did load initially set up observing event user does not have username(or user does have username if I use a different account) observing event user does not have username(or user does have username if I use a different account) 

Mi estructura de datos de Firebase:

Captura de pantalla

Esto es lo que sucede cuando imprimo la instantánea

 observing event Snap (FJpA8PGCmwPRT9xjdrZENMIH8wJ3) { email = "test@gmail.com"; id = 10207417529265514; name = "Jason"; } 

Estoy feliz de proporcionar más información si es necesario pero pensé que podría ser algo dentro de la function.