Это действительно не масштабируется. В идеале, вы хотели бы разложить данные. Например, вы бы создали дополнительный узел, назовем его feed
. Каждый раз, когда текущий зарегистрированный пользователь следует за другим пользователем, вы добавляете идентификаторы сообщений этих пользователей (если они есть) в ленту текущего пользователя следующим образом:
-feed
-userID
-postID
Теперь, в приведенном выше примере, когда Человек B следует за Человеком A, если у Человека A есть существующие посты, получите id
этих постов и сохраните их в feed
в person B id
с 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
, чтобы получить фактическое значение сообщения. Вот и все. Это выравнивает данные. Это будет моя рекомендация.