Каждый раз, когда вы звоните 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
.