什么是最可扩展的解决方案?
- posts
- userID
- userID
- randomID
- randomID
- followers
- personB userid
- personA userid
- following
- personA userid
- personB userid
我有一个这样的数据库结构。因此,如果人员A开始跟随人员B,他将被置于人员B的ID下的“跟随者”下。同时,将人B置于“跟随”下的人A的身分之下。
如果某人在该应用上发布信息,则该信息将被发布在“信息”下,并且其子代的用户ID为该用户的ID(在该子目录下,其子ID为不同子代的儿童的随机ID)。 / p>
我尝试过
let queryRef = self.ref.child("posts/\(userID)")
queryRef?.observe(.childAdded, with: { (snapshot) in
// new post from a friend
})`
我必须对用户关注的每个人都使用此方法,但是如果有很多人发布了东西,那将真的很慢!
你们有解决此问题的智能扩展解决方案吗?
答案 0 :(得分:1)
这确实不可扩展。理想情况下,您想散布数据。例如,您将创建其他节点,我们将其称为feed
。每次当前登录的用户关注另一个用户时,您都会将该用户的帖子ID(如果有)添加到当前用户的供稿中,如下所示:
-feed
-userID
-postID
现在,在您上面提供的示例中,当人员B跟随人员B时,如果人员A有现有帖子,请获取这些帖子的id
并将其存储在{{1}下的feed
中}和帖子的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
节点以获取实际的帖子值。而已。它将数据展平。这是我的建议。