2017-08-15 6 views
1

イベントの参加者のリストを取得したいと考えています。イベントノードには、従業員のID#だけがリストされています。私が達成したいのは、従業員ノードからそのIDに関連付けられた名前を取得することです。ここに私のdbaseの構造があります。IOS Swift - Firebaseデータベースの異なるノードから値を取得します

events: 
    uuid: 
     name: summer festival 2017 
     site: vegas 
     participants: 
      employeeID1: true 
      employeeID2: true 

Employee: 
    employeeID1: 
     name: gary 
     department: video production 

、ここでは私のコードです

@IBAction func downloadButtonAction(_ sender: UIButton) { 

     ref.child("events").child(eventKeyLabel.text!).child("participants").observeSingleEvent(of: .value, with: {(snapshot) in 

      // get the dictionary from the snapshot 
      if let participantsDict = snapshot.value as? [String : AnyObject] { 


       for each in participantsDict { 

        let employeeIDNum = each.key 
        let employeeName = self.getName(forUID: employeeIDNum) 

        self.employeeID.append(employeeIDNum) 
        self.name.append(employeeName) 

       } 

       print(self.employeeID) 
       print(self.name) 

      } 

     }) // End observeSingleEvent 

    } 


    func getName(forUID userID: String) -> String{ 

     var empName = "" 

     ref.child("Employee").child(userID).observe(DataEventType.value, with: { (snapshot) in 
      if let value = snapshot.value as? NSDictionary { 

       empName = (value["name"] as? String)! 
      } 
     }) 

     return empName 
    } 

結果:

["0001", "0002", "0003", "0004"] 
["", "", "", ""] 

FULL CODE:

@IBActionのFUNCのdownloadButtonAction(_差出人:UIButton){

ref.child("events").child(eventKeyLabel.text!).child("participants").observeSingleEvent(of: .value, with: {(snapshot) in 

    // get the dictionary from the snapshot 
    if let participantsDict = snapshot.value as? [String : AnyObject] { 


     for each in participantsDict { 

      let employeeIDNum = each.key 
      self.getName(forUID: employeeIDNum) { empName in 
       self.name.append(empName) 
       print(empName) 
      } 

      self.employeeID.append(employeeIDNum) 


     } 

     print(self.employeeID) 
     print(self.name) 

    } 

}) // End observeSingleEvent 

}

FUNC用のgetName(forUIDユーザーID:文字列は、コールバック:@escaping(文字列) - >ボイド){

ref.child("Employee").child(userID).observe(DataEventType.value, with: { (snapshot) in 
    if let value = snapshot.value as? NSDictionary { 
     print(value) 
     if let empName = value["name"] as? String{ 
      callback(empName) 
     } 
    } 
}) 

}

それは従業員名を返しません。助けてください。ありがとうございました!

+0

empName =(value ["name"]?Stringの後にprint(empName)を追加して確認してください!ここにempNameが存在するかどうかを調べるgetName関数内の文 – 3stud1ant3

+0

こんにちは、お返事ありがとうございます。私はそれを試して、それは名前を返したが、名前を印刷した後にクラッシュする。それは印刷されますが返されません – TSM

+0

私の答えを確認してください、あなたが問題に直面した場合は、助けを参照してくださいコメントで尋ねてください – 3stud1ant3

答えて

0

問題は、あなたがgetNameメソッドを呼び出している関数に名前を取得するためにコールバックを使用する必要があるので、あなたはこのような何かを行うことができ、firebaseからこのフェッチは非同期呼び出しがあるためということです。

@IBAction func downloadButtonAction(_ sender: UIButton) { 

     ref.child("events").child(eventKeyLabel.text!).child("participants").observeSingleEvent(of: .value, with: {(snapshot) in 

      // get the dictionary from the snapshot 
      if let participantsDict = snapshot.value as? [String : AnyObject] { 


       for each in participantsDict { 

        let employeeIDNum = each.key 
        self.getName(forUID: employeeIDNum) 

        self.employeeID.append(employeeIDNum) 


       } 

       print(self.employeeID) 
       print(self.name) 

      } 

     }) // End observeSingleEvent 

    } 


    func getName(forUID userID: String) { 



     ref.child("Employee").child(userID).observe(DataEventType.value, with: { (snapshot) in 
      if let value = snapshot.value as? NSDictionary { 
       print(value) //add here 
       if let empName = value["name"] as? String{ 
         self.name.append(empName) 

       } 
      } 
     }) 


    } 
+0

print(empName)の下にprint(self.name)を置くと、すべての名前が出力されるので、名前配列に追加されていると思います。実際にボタンをクリックすると、すべての参加者データをループしてファイルをExcelに変換し、それをEITableViewに表示するのではなく電子メールに送信します。 – TSM

+0

こんにちは、私のコードには何も問題はないことがわかりました。問題は、キー名についてです。参加者のリストをcsv形式でダウンロードして電子メールで送信できるようになりました。私はあなたの助けなしにはできなかったので、どうもありがとう! – TSM

+0

@TSM私は助けてくれることができてうれしいです、おめでとう、私は非同期と同期のコール、コールバックなどについて学んだことを願っています。これらのトピックについて学んでください、これらはiosの開発、ハッピーコーディングの重要なトピックです:) – 3stud1ant3

関連する問題