2016-11-22 2 views
0

Я создал следующую систему, в которой пользователи могут следовать друг за другом, но это не очень полезно на данный момент. Кажется, я не могу понять, как показывать только сообщения пользователей, которых вы придерживаетесь, поэтому я здесь, чтобы спросить вас, как вы это сделаете.Показаны сообщения от пользователей, которых вы видите - swift & firebase

Позвольте мне показать вам, как база данных создана:

enter image description here

Как вы можете видеть, у меня есть кран под названием Users - там все пользователи ID сохраняются. Всякий раз, когда пользователь хочет следовать за другим пользователем, делается ответвление Following и под ним пользователь, которому был нажат текущий пользователь, - его идентификатор хранится под Following. И затем текущий пользовательский идентификатор добавляется к пользователю, которого он/она следует за Followers. Довольно просто, но сложно объяснить: D Я надеюсь, что вы пойдете туда, куда я иду.

Итак, теперь я хочу только показывать сообщения пользователей, за которыми я следую. Как бы Вы это сделали? Вы сделали бы это так: Когда пользователь делает сообщение, он добавляется к своему имени под краном под названием Posts И добавляется ко всем именам пользователей под PostsToFollow? Я просто думаю, что это займет много места в базе данных? Разве нет лучшего способа сделать это?

Хорошо, вот часть моего кода, которая вызывает у меня всех пользователей, которые сейчас являются пользователями. Как я могу использовать этот код, когда создаю новый пост, добавьте его в их postsToFollow?

func startObersvingDB() { 
     FIRDatabase.database().reference().child("Users").child(IDgotten).child("Followers").observeEventType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in 
      var newUpdates = [FollowersStruct]() 



      for update in snapshot.children { 
       print(update) 
       let updateObject = FollowersStruct(snapshot: update as! FIRDataSnapshot) 
       newUpdates.append(updateObject) 

      } 

      self.updates = newUpdates.reverse() 
      self.tableView.reloadData() 


     }) { (error: NSError) in 
      print(error.description) 
     } 
    } 

Фрэнку:

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

Я сделал это до сих пор, пытаясь сделать то, что вы сказали :-):

let feed = Sweet(content: update, addedByUser: name!, profilePhoto: uid, likesForPost: ["user id": false], date: timePosted, category: 1, workoutComment: "", workoutTime: "") 
    let feedRef = FIRDatabase.database().reference().child("feed-items").childByAutoId() 


    feedRef.setValue(feed.toAnyObject()) 

    FIRDatabase.database().reference().child("Users").child(uid).child("Followers").observeEventType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in 
     var newFollowers = [FollowersStruct]() 



     for updateFollowers in snapshot.children { 
      let updateObjectFollowers = FollowersStruct(snapshot: updateFollowers as! FIRDataSnapshot) 
      newFollowers.append(updateObjectFollowers) 

     } 

     self.followings = newFollowers 


     print(self.followings.count) 




     for i in 0..<self.followings.count { 
      let followers = self.followings[i] 

      let feedRefFollowers = FIRDatabase.database().reference().child("Users").child(followers.Id).child("Wall").childByAutoId() 
      feedRefFollowers.setValue(feed.toAnyObject()) 
     } 


    }) { (error: NSError) in 
     print(error.description) 
    } 

ответ

0

Дать пост под собственным именем пользователя и всех имен его последователем является типичным примером веера данные. Это действительно дублирует данные, но преимущество в том, что ваши операции чтения будут намного быстрее и имеют значительно более простой код.

Если вы не хотите дублировать весь пост, вы также можете просто написать ключ нового сообщения под «стенкой» каждого последователя. Затем, когда вам нужно показать список сообщений для пользователя, вы читаете их «стену» и клиентскую сторону, присоединяющиеся к каждому сообщению. Это подход, принятый в нашем classic Firefeed example app.

Любой из этих подходов представляет собой форму денормализации: дублирование части ваших данных, чтобы улучшить производительность чтения.

Настоятельно рекомендуем прочитать эту статью на NoSQL data modeling и проверить нашу серию видео на Firebase for SQL developers. Ох ... и этот blog post on client-side fan-out тоже не повредит.

+0

Похоже, я должен пойти с добавлением ключа сообщений к пользователям «стена». Но как я прочитаю все эти ключи, а потом получаю сообщения из этого? –

+0

И как мне получить ключ от недавно добавленного сообщения? –

+0

Я отредактировал это сообщение с сообщением для вас, где вы можете увидеть, что я пытаюсь сделать: D –