Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Swift中带有闭包的函数中检索字符串值_Swift_Firebase_Closures_Firebase Realtime Database - Fatal编程技术网

从Swift中带有闭包的函数中检索字符串值

从Swift中带有闭包的函数中检索字符串值,swift,firebase,closures,firebase-realtime-database,Swift,Firebase,Closures,Firebase Realtime Database,我试图从Firebase中检索一个字符串值,以便获得每个用户名,该用户名具有传递给函数的唯一UID,该函数返回用户的用户名。但是-由于firebaseObserveEvent处于closures中,因此我无法返回任何值,因为操作发生异步(?)。我想知道这是否是实现这一目标的一种方式 函数如下所示: func GetUsername(uid:String) -> String { var username = String() firebase.child("Users").

我试图从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
}

显然,这是行不通的,但我希望能够通过使用GetUsername(“whatevertheidmightbe”)来获取数据。想法?

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

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("")
    }
}
这样调用函数

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

只需添加一个完成项handler@LeoDabus这样地?func GetUsername(uid:String,callback:(String)->String){firebase.child(“Users”).child(uid).observeSingleEventOfType(.Value){(snapshot:FIRDataSnapshot)在callback(snapshot.Value![“DisplayName”]as!String)}中我真的无法让它工作,不知何故…可能的复制品可能的复制品非常感谢你。还有一个问题;是否可以将其设置为字符串的返回类型?(所以我可以很容易地调用GetUsername并以字符串格式检索用户名?是的,我知道-但我只是问是否可以将返回类型设置为string?正如我现在看到的,它是Void()。我对闭包没有太多经验,所以据我所知,这可能也是不可能的。。@askaale我已经编辑了答案,现在你对remove
void
有了更好的了解,所以你可以清楚地理解它。这里我们在完成处理程序中传递字符串值。是的,就我而言,你不能返回字符串类型的值(在return name中)格式?至少我不能,当我尝试在控制台中打印它时(没有从函数中打印它,而是使用return)。