askaale askaale - 4 months ago 37
Swift Question

Retrieve String value from function with closure in Swift

I am trying to retrieve a string value from Firebase in order to get each username with an unique UID that is passed to the function, which returns the username of the user. However - since the firebase

ObserveEvent
is in
closures
, I can't return any value back because the actions happens asynchronous(?). I was wondering if it was a way of accomplishing this?

The function looks like this:

func GetUsername(uid:String) -> String {
var username = String()
firebase.child("Users").child(uid).observeSingleEventOfType(.Value) { (snapshot:FIRDataSnapshot) in

username = snapshot.value!["Username"] as! String

}

return username
}


Obviously this doesn't work, but I want to be able to get the data by doing a GetUsername("whatevertheidmightbe"). Ideas?

Answer

You need to create completion handler like this

func GetUsername(uid:String , completion: (String) -> ()) {
    firebase.child("Users").child(uid).observeSingleEventOfType(.Value) { (snapshot:FIRDataSnapshot) in
    if let username = snapshot.value!["Username"] as? String
        completion(username)
    }
    else {
        completion("")
    }
}

And call function like this way

self.GetUsername(str) { (name) -> () in
    if name.characters.count > 0 {
         print(name)
    }
    else {
         print("Not found")
    }
}