2017-01-02 102 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