Ios 无法将字符串从Firebase数据库关闭块传递到公共变量
此代码当前位于使用Firebase的登录处理程序的视图控制器中。一个字符串被写入实时数据库,retrieveUserType函数读取该数据。当前,在按下登录按钮的iAction后尝试打印用户类型时,变量的值仍为空字符串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
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以了解如何管理它。