使用Firebase和Swift获取与特定用户关联的帖子

使用Firebase和Swift获取与特定用户关联的帖子,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我有一段代码,可以从Firebase数据库中提取所有帖子。我试图让代码为特定的用户id提取所有帖子。我数据库的结构是,用户id有一组与之关联的帖子id 我必须提取所有帖子的代码: DataService.ds.REF_POSTS.observe(.value, with: { (snapshot) in self.posts = [] if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {

我有一段代码,可以从Firebase数据库中提取所有帖子。我试图让代码为特定的用户id提取所有帖子。我数据库的结构是,用户id有一组与之关联的帖子id

我必须提取所有帖子的代码:

DataService.ds.REF_POSTS.observe(.value, with: { (snapshot) in
    self.posts = []
    if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
        for snap in snapshot {
            print("SNAP: \(snap)")
            if let postDict = snap.value as? Dictionary<String, AnyObject> {
                let key = snap.key
                let post = Post(postKey: key, postData: postDict)
                self.posts.append(post)
            }
        }
    }
    self.feedTableView.reloadData()
})
看起来我需要访问users对象的子对象(posts),然后循环浏览posts。如何循环浏览(并观察更改)与登录用户关联的帖子

编辑(尝试循环浏览用户的所有帖子):

\=Auth.Auth().addStateDidChangeListener{(Auth,用户)在
如果let user=user{
让userId=user.uid
打印(“用户:\(字符串(描述:userId))”)
让newPost=DataService.ds.REF\u USERS.child(“\(userId)”).child(“posts”)
newPost.observe(.value,其中:{(快照)位于
self.posts=[]
如果让snapshot=snapshot.children.allObjects为?[DataSnapshot]{
用于管理单元快照{
打印(“ERIC SNAP:\(字符串(描述:SNAP.value)))
如果让postDict=snap.value作为字典{
让key=snap.key
让post=post(postKey:key,postData:postDict)
self.posts.append(post)
}
}
}
self.feedTableView.reloadData()
})
//打印(“新帖子:\(新帖子)”)
}
}

获取登录用户帖子的方法如下:

guard let uid = Auth.auth().currentUser?.uid else {
            return
        }
        print("USER ID: \(uid)")
        let newPost = DataService.ds.REF_USERS.child("\(uid)").child("posts")

        newPost.observe(.value, with: { (snapshot) in
            self.posts = []
            if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
                for snap in snapshot {
                    let postData = DataService.ds.REF_POSTS.child(snap.key)
                    postData.observe(.value, with: { (snapshot) in
                        if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
                            let key = snapshot.key
                            let post = Post(postKey: key, postData: postDict)
                            self.posts.append(post)
                        }
                        self.feedTableView.reloadData()
                    })
                }
            }

        })
guard let uid=Auth.Auth().currentUser?.uid else{
返回
}
打印(“用户ID:\(uid)”)
让newPost=DataService.ds.REF\u USERS.child(\(uid)”).child(“posts”)
newPost.observe(.value,其中:{(快照)位于
self.posts=[]
如果让snapshot=snapshot.children.allObjects为?[DataSnapshot]{
用于管理单元快照{
让postData=DataService.ds.REF\u POSTS.child(snap.key)
postData.observe(.value,其中:{(快照)位于
如果让postDict=snapshot.value作为字典{
让key=snapshot.key
让post=post(postKey:key,postData:postDict)
self.posts.append(post)
}
self.feedTableView.reloadData()
})
}
}
})

获取登录用户帖子的方法如下:

guard let uid = Auth.auth().currentUser?.uid else {
            return
        }
        print("USER ID: \(uid)")
        let newPost = DataService.ds.REF_USERS.child("\(uid)").child("posts")

        newPost.observe(.value, with: { (snapshot) in
            self.posts = []
            if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
                for snap in snapshot {
                    let postData = DataService.ds.REF_POSTS.child(snap.key)
                    postData.observe(.value, with: { (snapshot) in
                        if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
                            let key = snapshot.key
                            let post = Post(postKey: key, postData: postDict)
                            self.posts.append(post)
                        }
                        self.feedTableView.reloadData()
                    })
                }
            }

        })
guard let uid=Auth.Auth().currentUser?.uid else{
返回
}
打印(“用户ID:\(uid)”)
让newPost=DataService.ds.REF\u USERS.child(\(uid)”).child(“posts”)
newPost.observe(.value,其中:{(快照)位于
self.posts=[]
如果让snapshot=snapshot.children.allObjects为?[DataSnapshot]{
用于管理单元快照{
让postData=DataService.ds.REF\u POSTS.child(snap.key)
postData.observe(.value,其中:{(快照)位于
如果让postDict=snapshot.value作为字典{
让key=snapshot.key
让post=post(postKey:key,postData:postDict)
self.posts.append(post)
}
self.feedTableView.reloadData()
})
}
}
})

您需要在每个帖子上附加一个侦听器,在该用户节点下有一个键。@FrankvanPuffelen我在上面添加了一个编辑。这是你推荐的吗?有些东西似乎仍然不对劲,因为我在打印
ERIC SNAP
时得到的值是
ERIC SNAP:Optional(1)
您需要在每个帖子上附加一个侦听器,您在该用户节点下有一个键。@FrankvanPuffelen我在上面添加了一个编辑。这是你推荐的吗?有些东西似乎仍然不正确,因为我在打印
ERIC SNAP
时得到的值是
ERIC SNAP:Optional(1)
guard let uid = Auth.auth().currentUser?.uid else {
            return
        }
        print("USER ID: \(uid)")
        let newPost = DataService.ds.REF_USERS.child("\(uid)").child("posts")

        newPost.observe(.value, with: { (snapshot) in
            self.posts = []
            if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
                for snap in snapshot {
                    let postData = DataService.ds.REF_POSTS.child(snap.key)
                    postData.observe(.value, with: { (snapshot) in
                        if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
                            let key = snapshot.key
                            let post = Post(postKey: key, postData: postDict)
                            self.posts.append(post)
                        }
                        self.feedTableView.reloadData()
                    })
                }
            }

        })