ios - Firebase 观察方法不会返回并继续

标签 ios swift firebase

我正在为登录页面编写一些代码,我们在其中获取用户名并找到关联的密码。暂时我已经说过“如果用户名下存在电子邮件,则完成 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/

相关文章:

android - Cordova PhoneGap 的局限性

javascript - 双击在 iPhone Safari 浏览器中不起作用

ios - 类型 'GameViewController' 不符合协议(protocol) 'FBSDKLoginButtonDelegate'

ios - 以编程方式将 UIImage 添加到 ImageView 中,以非编程方式 SWIFT

ios - 当我在应用程序中按创建帐户时,它会在没有任何信息的情况下创建帐户

javascript - promise 不等待异步对象条目 firebase 调用

ios - 在 iOS 中,是否有一种简单的方法可以在屏幕上直观地绘制所有 ViewBounds?

ios - 如何实现 Firebase Listener 来观察数据库中的实时变化

xcode - Swift 在枚举上使用 if 导致错误无法转换为 '_ArrayCastKind'

android - 如何从 Firebase 实时数据库中删除监听器