Firebase - создание домашней страницы сообщений людей, на которых вы подписаны (swift) - PullRequest
0 голосов
/ 30 августа 2018

какое самое масштабируемое решение для этого?

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

У меня есть структура базы данных, подобная этой. таким образом, если человек A начинает следовать за человеком B, он будет помещен под удостоверением личности B под "последователями". В то же время лицо B будет помещено под идентификатором лица A в поле «после».

Если человек создает сообщение в приложении, оно будет опубликовано в разделе «сообщения», и у него будет ребенок с идентификатором пользователя того, кто опубликовал сообщение (и там - дети со случайными идентификаторами разных сообщений, которые они имеют).

Я пытался

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

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

    // new post from a friend 

})`

Я должен был бы использовать этот метод для каждого человека, за которым следит пользователь, хотя это было бы очень медленно, если бы было много людей, которые разместили материал!

У вас, ребята, есть какие-нибудь умные масштабируемые решения этой проблемы?

1 Ответ

0 голосов
/ 30 августа 2018

Это действительно не масштабируется. В идеале, вы хотели бы разложить данные. Например, вы бы создали дополнительный узел, назовем его 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, чтобы получить фактическое значение сообщения. Вот и все. Это выравнивает данные. Это будет моя рекомендация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...