如何在循环内调用Firebase观察?

时间:2019-06-28 00:57:29

标签: json swift multithreading firebase-realtime-database

我有一个Firebase JSON结构,该结构具有一个自动生成的“派对ID”,其子级为0-200。作为这些孩子的孩子,我自动生成了“歌曲ID”作为键,并将投票数作为值。看起来像这样:

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()
                })


            }
        })
    }

运行此方法时,“外部”打印语句将正确打印这些值。但是,“ Inside”打印语句似乎在重复某些值。由于我打算将歌曲对象添加到数组中,因此无法重复对象。

SongApi的observeSong函数还使用observeSingleEvent。此函数从观测值获取字典,并使用它创建歌曲对象。 ObservSong函数如下所示:

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可以解决此问题,因为只有在打印完所有“外部”打印之后才调用observeSong函数;但是,这也没有解决问题。您知道为什么会这样吗?什么可以解决问题?

在此先感谢您提供的任何帮助!

0 个答案:

没有答案