У меня есть структура Firebase JSON, у которой есть автоматически сгенерированный "Party Id" с детьми от 0-200.Как дети этих детей, я автоматически сгенерировал «Идентификаторы песни» в качестве ключа и подсчет голосов в качестве значения.Это выглядит так:
![Screenshot of Firebase JSON](https://i.stack.imgur.com/cvnIZ.png)
Моя проблема возникает, когда я пытаюсь наблюдать за каждым из этих объектов песни.Мой код для выполнения этого наблюдения (убрал некоторые дополнительные вещи, чтобы упростить вопрос):
REF_PARTY_VOTING.child(party.partyId).observeSingleEvent(of: .value) { (snapshot) in
guard let allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }
allObjects.forEach({ (snap) in
let options = snap.value as! [String: Any]
for option in options {
print()
print("Outside")
print(option.key)
print()
SongApi().observeSong(withId: option.key, completion: { (song) in
print()
print("Inside")
print(option.key)
print()
})
}
})
}
При запуске этого метода оператор вывода "Outside" печатает значения правильно.Тем не менее, оператор печати "Inside", кажется, повторяет некоторые значения.Так как я планирую добавить объекты песни в массив, у меня не может быть повторяющихся объектов.
Функция SongApi наблюдать за песней также используета наблюдениеSingleEvent.Эта функция получает словарь из значения наблюдения и использует его для создания объекта песни.Функция meetSong выглядит следующим образом:
func observeSong(withId id: String, completion: @escaping (Song) -> Void) {
REF_SONGS.child(id).observeSingleEvent(of: DataEventType.value, with: { snapshot in
if let dict = snapshot.value as? [String: Any] {
let song = Song(songData: dict)
completion(song)
}
})
}
Первоначально я думал, что проблема потенциально может быть решена с помощью DispatchGroup, поскольку функция наблюдаем только после того, как будут напечатаны все «внешние» отпечатки;однако это также не решило проблему.Знаете ли вы, почему это происходит и что может решить проблему?
Заранее благодарим за любую помощь, которую вы можете оказать!