我正在为登录页面编写一些代码,我们在其中获取用户名并找到关联的密码。暂时我已经说过“如果用户名下存在电子邮件,则完成 segue”。但是,当我调用检查电子邮件的方法 getEmail 时,它似乎永远不会以完整的电子邮件地址正确退出。 print(email) 返回正确的电子邮件地址,所以我知道我已经检索到它并且它是正确的。不过,我似乎从来没有摆脱过这种方法。真的卡在这里了!这是我的代码:
func getEmail(name: String) -> String{
var email = ""
ref = Database.database().reference()
self.ref.child("Users").child(name).observeSingleEvent(of: .value, with: { (snapshot) in
if let user = snapshot.value as? [String:Any] {
print("email retrieved");
email = user["email"] as! String;
print(email)
return;
}
else{
print("email could not be retrieved from the user.");
}
}){ (error) in
print("Could not retrieve object from database because: ");
print((Any).self);
}
return email;
}
func validate(){
if(Username.text == ""){
EmptyStringAlert();
}
let email = getEmail(name: Username.text!);
print(email)
if(email == ""){
return;
}
performSegue(withIdentifier: "LoginSuccess", sender: nil)
}
最佳答案
对 Firebase 的调用是异步的,因此您必须在函数中使用完成来获取数据。尝试这样的事情:
func getEmail(name: String, completion: @escaping (Bool, Any?, Error?) -> Void) {
var email = ""
ref = Database.database().reference()
self.ref.child("Users").child(name).observeSingleEvent(of: .value, with: { (snapshot) in
if let user = snapshot.value as? [String:Any] {
email = user["email"] as! String
completion(true, email, nil)
}
else {
completion(false, nil, nil)
}
}){ (error) in
completion(false, nil, error)
}
}
func validate(){
if(Username.text == ""){
EmptyStringAlert();
}
getEmail(name: Username.text!) { (success, response, error) in
guard success, let email = response as? String else {
print(error ?? "Failed getEmail..")
return
}
if(email == "") {
return
}
performSegue(withIdentifier: "LoginSuccess", sender: nil)
}
}
关于ios - Firebase 观察方法不会返回并继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46875045/