Почему функция firebase fetch дублирует, так сказать, элементы, которые она извлекает? - PullRequest
0 голосов
/ 21 апреля 2019

У меня есть метод извлечения ниже.

Проблема в том, что он удваивает значения без причины. Так, например, если в первом «цикле» значением является media1, то в следующем цикле будет также указано media1, хотя в точке этого узла есть только одна вещь: media1.

Как мне решить эту проблему?

var mediaTheUserLikes = [String]()
var num = 0

func getYourLikesForThisPost() {
    mediaTheUserLikes.removeAll()
    ref.child("YourLikes").child(Auth.auth().currentUser!.uid).child((selectedPost?.user.userID)!).child(postID!).observe(.childAdded) { (snap) in
        if self.mediaTheUserLikes.count > 0 && self.mediaTheUserLikes[self.num] != snap.key {
            self.mediaTheUserLikes.append(snap.key)
        } else if self.mediaTheUserLikes.count == 0 {
            self.mediaTheUserLikes.append(snap.key)
        }
    }
}

Мое решение, как показано выше, похоже, не работает.

1 Ответ

2 голосов
/ 21 апреля 2019

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

Учитывая то, как вы называете свой метод, вполне вероятно, что вы на самом деле хотите получить данные только один раз, а затем прекратить их наблюдать. В этом случае вам лучше использовать , используя observeSingleEvent(of: .value:

func getYourLikesForThisPost() {
    mediaTheUserLikes.removeAll()
    ref.child("YourLikes").child(Auth.auth().currentUser!.uid)
      .child((selectedPost?.user.userID)!).child(postID!)
      .observeSingleEvent(of: .value) { (snapshot) in
        for snap in snapshot.children.allObjects as? [DataSnapshot] {
          if self.mediaTheUserLikes.count > 0 && self.mediaTheUserLikes[self.num] != snap.key {
            self.mediaTheUserLikes.append(snap.key)
          } else if self.mediaTheUserLikes.count == 0 {
            self.mediaTheUserLikes.append(snap.key)
          }
        }
    }
}):

Некоторые изменения:

  • В этом коде используется observeSingleEvent(of:, что означает, что данные читаются только один раз, а затем наблюдатель немедленно удаляется из Firebase SDK.
  • Этот код учитывает .value вместо .childAdded, что означает, что возвращаемый снимок может содержать несколько дочерних узлов. По этой причине он зацикливается на snapshot.children.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...