2017-01-02 287 views
1

我有一個在Swift中開發的應用程序,它使用Firebase作爲後端。檢索嵌套鍵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 

和火力地堡結構

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的異步特性可以使代碼在閉包運行時執行*比閉包中的代碼更慢。如果您看到答案,則打印語句僅出現在閉包內,因此變量必須包含數據,因此時間安排很好。您的問題處於更高層次,因爲您在創建單元格時不應訪問Firebase。您應該訪問Firebase以填充*數組*,然後將其作爲您的tableView的數據源。單元應該*只訪問該數組,這使得它非常靈敏。 – Jay