2017-09-01 15 views
1

こんにちは私は問題があり、アドバイスや回答に感謝します。データベースからの値を取得する

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" 

あなたの最後のコメントを考えると素敵な一日

+0

getUserProfileMDP 'で.observeSingleEvent'()' 'ので、非同期です。したがって、プログラムの制御フローは、あなたが考えるものではありません。コールバックを使用する! – Moritz

+0

「コールバック」とは何ですか? –

答えて

2

を持って、私はあなたがほとんどそこにいることを言うだろう:それは私のデータベースの値を得ることはありませんが、上のクラスに初期化された値は、しかしここに例があります。私はあなたのコードの他の部分を修正しませんでした。メソッドシグネチャに補完ハンドラを追加し、ハンドラにパスワード値を渡して、これがどのように動作するかを示しました。ハンドラは、非同期クロージャの内部で呼び出される必要があります。

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 
} 
+0

私は@IBActionで書いたようにgetUserProfileMDPを呼び出すと、この文法を理解するのに困っています。解決されません。印刷はまだMDPがクラスで初期化されました –

+0

print(self.MDP) '{パスイン...}'、後でない。 – Moritz

関連する問題