Как вызвать Firebase наблюдения внутри цикла? - PullRequest
2 голосов
/ 28 июня 2019

У меня есть структура Firebase JSON, у которой есть автоматически сгенерированный "Party Id" с детьми от 0-200.Как дети этих детей, я автоматически сгенерировал «Идентификаторы песни» в качестве ключа и подсчет голосов в качестве значения.Это выглядит так:

Screenshot of Firebase JSON

Моя проблема возникает, когда я пытаюсь наблюдать за каждым из этих объектов песни.Мой код для выполнения этого наблюдения (убрал некоторые дополнительные вещи, чтобы упростить вопрос):

    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, поскольку функция наблюдаем только после того, как будут напечатаны все «внешние» отпечатки;однако это также не решило проблему.Знаете ли вы, почему это происходит и что может решить проблему?

Заранее благодарим за любую помощь, которую вы можете оказать!

...