2017-01-02 20 views
1

私はFirebaseをバックエンドとして使用するSwiftで開発したアプリケーションを持っています。ネストされたキーを取得するFirebaseデータベース

私はこのコードを試してみてください、ユーザーの名前を取得し、メッセージでそれらを表示したい
MESSAGES 
    -KW83KXYFzNgo-ibxKQV 
     --dateSent: "2016-09-09 12:30:23+0000" 
     --smiley:"smiley1" 
     --userID:"0QggCGYr46fcz3ak8tcQjsyZ9sJ2" 
Users 
    -- 0QggCGYr46fcz3ak8tcQjsyZ9sJ2 
     --name: "john" 
     --photo:"photoURL" 

self.ref = FIRDatabase.database().reference() 
self.ref.child("messages").observe(.childAdded, with: { snapshot in   
    if let snapshotValue = snapshot.childSnapshot(forPath: Constants.Messages.senderId).value { 
    FIRDatabase.database().reference().child("Users") 
     .child(snapshotValue as! String).observe(.value, with: {userSnapshot in 
      if let userSnapshotValue = userSnapshot.value as? [String:Any] { 
       self.usernames.append(userSnapshotValue[Constants.UserFields.nickName] as! String) 
      } 
     }) 

結果がこれです:

0QggCGYr46fcz3ak8tcQjsyZ9sJ2 
[] 
VAMFsmkM7DObJ0x752eVT1WuICe2 
[] 
0QggCGYr46fcz3ak8tcQjsyZ9sJ2 
[] 
VAMFsmkM7DObJ0x752eVT1WuICe2 
[] 
0QggCGYr46fcz3ak8tcQjsyZ9sJ2 
[] 
VAMFsmkM7DObJ0x752eVT1WuICe2 
[] 

ので、コードが取得しますネストされたクエリは実行されませんでした。どんな命題?

答えて

0

ここで何をしたいの簡略化と、より詳細なバージョンです:問題は、ネストされたクエリがある

let usersRef = ref.child("users") 
    let postsRef = ref.child("posts") 

    postsRef.observe(.childAdded, with: { (postSnap) in 

     let postDict = postSnap.value as! [String:AnyObject] 
     let msg = postDict["msg"]! 
     let userId = postDict["user_id"] as! String 

     let thisUserRef = usersRef.child(userId) 
     thisUserRef.observeSingleEvent(of: .value, with: { userSnap in 

      let userDict = userSnap.value as! [String: AnyObject] 
      let userName = userDict["name"] as! String 
      print("msg: \(msg)") 
      print(" fromUid: \(userId)") 
      print(" userName: \(userName)") 
     }) 
    }) 

と出力

msg: some message from uid_0 
    fromUid: uid_0 
    userName: Bill 
msg: some message from uid_1 
    fromUid: uid_1 
    userName: Leroy 

とFirebase構造

users 
    uid_0 
    name: "Bill" 
    uid_1 
    name: "Leroy" 
posts 
    post_0 
    msg: "some message from uid_0" 
    user_id: "uid_0" 
    post_1 
    msg: "some message from uid_1" 
    user_id: "uid_1" 
+0

非同期ので、結果が期待どおりに異なる、私は別のクエリを作成しようとすると、ユーザーのクエリが実行されます私はtableviewのセルを作成しますが、私はまだスクロールアップとスクロールのときに特に問題があります。 –

+0

@TawfikBouabidこれは正しくありません。 Firebaseの非同期性により、コードはクロージャ内のコードよりも実行速度が遅くなります。答えを見ると、print文はクロージャー内でのみ発生するので、変数にはデータが入っていなければならず、タイミングは問題ありません。あなたの問題は、セルを作成するときにFirebaseにアクセスすべきではないという点で、より高いレベルにあります。 Firebaseにアクセスして、* array *にデータを取り込んでからtableViewのデータソースとして使用する必要があります。セルはその配列にのみアクセスする必要があり、非常に応答性に優れています。 – Jay