Firebase-对您关注的人的帖子进行家庭供稿(快速)

时间:2018-08-30 07:25:44

标签: swift firebase firebase-realtime-database social-networking

什么是最可扩展的解决方案?

- 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 

})`

我必须对用户关注的每个人都使用此方法,但是如果有很多人发布了东西,那将真的很慢!

你们有解决此问题的智能扩展解决方案吗?

1 个答案:

答案 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节点以获取实际的帖子值。而已。它将数据展平。这是我的建议。