【问题标题】:Retrieving value from database从数据库中检索值
【发布时间】:2017-09-01 19:58:36
【问题描述】:

您好,我有一个问题,如果有任何建议或回答,我将不胜感激。

   func getUserProfileMDP(){

    // set attributes to textField
    var ref: DatabaseReference!
    ref = Database.database().reference()
    let user = Auth.auth().currentUser
    print(user!.uid)
    ref.child("users").child((user?.uid)!).observeSingleEvent(of: .value, with: { (snapshot) in
        // Get user value
        guard let value = snapshot.value as? [String: String] else { return }
        print(value)
        let passwordValue = value["password"]!as! String
        print(passwordValue)
        self.MDP = passwordValue // prints the right value from database

    }){ (error) in
        print(error.localizedDescription)
    }
    print(self.MDP) // prints the value innitialised in class(nope)
}

这是从数据库中获取值的函数。它有效(第一个打印得到正确的值)

    @IBAction func register(_ sender: Any) {

    print(self.MDP)// prints the value innitialised in class(nope)
    getUserProfileMDP()
    print(self.MDP) // prints the value innitialised in class(nope)
    let MDP = self.MDP

那是我需要密码来比较它。它没有让我得到数据库的值,而是在上面的类中初始化的值:

var MDP = "nope"

祝你有美好的一天

【问题讨论】:

  • 因为getUserProfileMDP() 中的.observeSingleEvent 是异步的。所以程序控制流并不是你想象的那样。使用回调!
  • 我是 swift 新手,你能准确地说什么是“回调”吗?

标签: swift3 firebase-realtime-database


【解决方案1】:

鉴于您的最后评论,我想说您快到了,但这里有一个示例。我没有修复您代码的其他部分,我只是在方法签名中添加了完成处理程序,并将密码值传递给处理程序,以向您展示这是如何工作的。必须在异步闭包内调用处理程序。

func getUserProfileMDP(completion: @escaping (String)->()) {
    // set attributes to textField
    var ref: DatabaseReference!
    ref = Database.database().reference()
    let user = Auth.auth().currentUser
    print(user!.uid)
    ref.child("users").child((user?.uid)!).observeSingleEvent(of: .value, with: { (snapshot) in
        // Get user value
        guard let value = snapshot.value as? [String: String] else { return }
        print(value)
        let passwordValue = value["password"]!as! String

        completion(passwordValue)

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

你这样称呼它:

getUserProfileMDP() { pass in
    print(pass)
    self.MDP = pass
}

【讨论】:

  • 抱歉打扰了,我无法理解它的语法,像你在我的@IBAction 中写的那样调用getUserProfileMDP 没有解决,打印仍然是在类中初始化的MDP
  • print(self.MDP) 应该在{ pass in ...} 内,而不是之后。
猜你喜欢
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多