从函数中检索字符串值,并在Swift中使用闭包

ask*_*ale 2 closures firebase swift firebase-realtime-database

我正在尝试从Firebase检索字符串值,以便为每个用户名提供一个传递给该函数的唯一UID,该函数返回用户的用户名.但是 - 由于firebase ObserveEvent存在closures,我无法返回任何值,因为操作是异步的(?).我想知道这是否是实现这一目标的一种方式?

该函数如下所示:

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
}
Run Code Online (Sandbox Code Playgroud)

显然这不起作用,但我希望能够通过GetUsername("whatevertheidmightbe")来获取数据.想法?

Nir*_*v D 7

您需要像这样创建完成处理程序

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("")
    }
}
Run Code Online (Sandbox Code Playgroud)

并以这种方式调用函数

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