Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.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
Ios 无法将字符串从Firebase数据库关闭块传递到公共变量_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios 无法将字符串从Firebase数据库关闭块传递到公共变量

Ios 无法将字符串从Firebase数据库关闭块传递到公共变量,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,此代码当前位于使用Firebase的登录处理程序的视图控制器中。一个字符串被写入实时数据库,retrieveUserType函数读取该数据。当前,在按下登录按钮的iAction后尝试打印用户类型时,变量的值仍为空字符串 var userType:String = "" func retrieveUserType(){ let userTypeDB = Database.database().reference() let currentUser = "kLxqZteRfBeC

此代码当前位于使用Firebase的登录处理程序的视图控制器中。一个字符串被写入实时数据库,retrieveUserType函数读取该数据。当前,在按下登录按钮的iAction后尝试打印用户类型时,变量的值仍为空字符串

var userType:String = ""

func retrieveUserType(){

    let userTypeDB = Database.database().reference()
    let currentUser = "kLxqZteRfBeC0bNIkLCjrPukMGx1"


 userTypeDB.child("UserType").child(currentUser).observeSingleEvent(of: .value, with: {
        (snapshot) in
        // Get user value
        let value = snapshot.value as? NSDictionary
        let email = value?["Email"] as? String ?? ""
        self.userType = value?["User Type"] as? String ?? ""

        print(email)
    }){
        (error) in
        print(error.localizedDescription)
    }
}

@IBAction func loginButtonPressed(_ sender: Any) {

    retrieveUserType()
    if userType != "Student"{
        print("error")
    } else {
        print("success")
    }
Larme是对的。retrieveUserType函数是异步的。也就是说你不知道什么时候能完成。因此,您需要一个完成块来处理userType变量。像这样:

typealias RetrieveUserCompletionBlock = ((_ userType: String) -> Void)
func retrieveUserType(withBlock completion: @escaping RetrieveUserCompletionBlock){

    let userTypeDB = Database.database().reference()
    let currentUser = "kLxqZteRfBeC0bNIkLCjrPukMGx1"


    userTypeDB.child("UserType").child(currentUser).observeSingleEvent(of: .value, with: {
        (snapshot) in
        // Get user value
        let value = snapshot.value as? NSDictionary
        let email = value?["Email"] as? String ?? ""
        completion(value?["User Type"] as? String ?? "")

        print(email)
    }){
        (error) in
        completion("default value") // or ""
        print(error.localizedDescription)
    }
}
如您所见,我们有RetrieveUserCompletionBlock,它就是一个TypeAlias。从这个完成块中,我们将正确地获得usertype````

如何调用这个新的异步函数?在这里:

retrieveUserType { (userType) in
    if userType != "Student"{
        print("error")
    } else {
        print("success")
    }
}

这应该可以帮助您:

您缺少FireBase方法是asynchone这一事实。self.userType=值?[用户类型]为?一串在if userType!=学生{。您可以根据需要添加日志,您将看到。查看Closure+Swift+Async以了解如何管理它。