Firebase - 将您关注的人的帖子制作为主页 (swift)

Firebase - Making a homefeed of posts of people you follow (swift)

对此最具扩展性的解决方案是什么?

- posts
    - userID
    - userID
          - randomID
          - randomID
- followers
    - personB userid
          - personA userid
- following 
    - personA userid
          - personB userid

我有一个这样的数据库结构。因此,如果 A 开始关注 B,他将被置于 "followers" 下 B 的 ID 之下。同时,B 将被置于 "following" 下 A 的 id 下。

如果某人在应用程序上创建了 post,它将在 "posts" 下被 post 编辑,并且具有 child 以及posted(在下面,childs 具有不同 posts 的随机 ID)。

我试过了

let queryRef = self.ref.child("posts/\(userID)")

 queryRef?.observe(.childAdded, with: { (snapshot) in

    // new post from a friend 

})`

我必须对用户关注的每个人都使用此方法,但如果有很多人posted 东西,这将非常慢!

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

这确实是不可扩展的。理想情况下,您希望分散数据。例如,您将创建额外的节点,我们称它为 feed。每次当前登录的用户关注另一个用户时,您都会将该用户的 posts id(如果有)添加到当前用户的提要中,如下所示:

-feed 
   -userID
      -postID

现在,在你上面给出的例子中,当 B 跟随 A 时,如果 A 有现有的 posts,获取那些 posts 的 id 并存储它们在 person B id 下的 feed 和 post 的 timestamp 中(如果你有任何并且你想整理提要上的 post):

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 或任何您真正需要显示提要的地方,您必须观察当前登录用户的提要(应该 return id每个 post),然后观察每个 post 和那个 id,cache/store 它们在 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 下,而是 post 本身的 id。在某些时候,你想要观察当前登录用户所做的所有 posts,所以我建议以类似的方式散开数据 - 创建 myPosts 节点(或随便你怎么称呼它想要)并像这样存储信息:

 -myPosts
     -userId
        -postId:true

然后你所要做的就是观察这个myPosts节点,获取当前登录用户的postId并观察posts节点以获得实际的post 价值。而已。它使数据变平。这是我的建议。