这确实不可扩展。理想情况下,您希望将数据扇出。例如,您将创建额外的节点,我们称之为feed。每次当前登录的用户关注另一个用户时,您都会将该用户的帖子 ID(如果有)添加到当前用户的提要中,如下所示:
-feed
-userID
-postID
现在,在上面给出的示例中,当人 B 关注人 A 时,如果人 A 有现有帖子,则获取这些帖子的 id 并将它们存储在 person B id 下的 feed 和 timestamp帖子的(如果你有任何并且你想整理提要上的帖子):
let followRef = Database.database().reference().child("followers")
guard currentUserUid = Auth.auth().currentUser?.uid else { return }
followRef.child(currentUserUid).observeSingleEvent(of: .value, with: { snapshot in
let followersArraySnapshot = snapshot.children.allObjects as! [DataSnapshot]
followersArraySnapshot.forEach({ (child) in
// child.key is the userUid of each user they follow (depends on your model)
let refFeed = Database.database().reference().child("feed")
refFeed.child(child.key).child("get the post ID").setValue(["timestamp" : timestamp])
})
})
然后在您的FeedViewController 或您真正需要显示提要的任何地方,您必须观察当前登录用户的提要(应该返回每个帖子的id),然后观察每个帖子id,将它们缓存/存储在 array 中,然后将它们显示给用户。
整个事情应该是这样的:
var posts = [Post]() // post array (based on your post model)
func observeFeedPosts(withUserId id: String, completion: @escaping (Post) -> Void) {
let feedRef = Database.database().reference().child("feed")
let postRef = Database.database().reference().child("posts")
feedRef.child(id).queryOrdered(byChild: "timestamp").observe(.childAdded, with: { snapshot in
let postId = snapshot.key
self.postRef.child(postId).observeSingleEvent(of: .value, with: { snapshot in
if let dictionary = snapshot.value as? [String : Any] {
// snapshot.value should return your post, just transform it based on your own model
let post = Post.transformDataToImagePost(dictionary: dictionary, key: snapshot.key)
self.posts.append(post)
}
})
}
这样您就不需要将userID 存储在posts 下,而是将帖子本身的id 存储。在某些时候,您想观察当前登录用户发布的所有帖子,因此我建议以类似的方式散出数据 - 创建 myPosts 节点(或任何您想要的名称)并存储信息,如所以:
-myPosts
-userId
-postId:true
那么你所要做的就是观察这个myPosts节点,获取当前登录用户的postId,然后观察posts节点来获取实际的post值。而已。它使数据扁平化。这是我的建议。