我有一个Firebase JSON结构,该结构具有一个自动生成的“派对ID”,其子级为0-200。作为这些孩子的孩子,我自动生成了“歌曲ID”作为键,并将投票数作为值。看起来像这样:
当我尝试观察这些歌曲对象中的每一个时,都会发生我的问题。我执行此观察的代码是(删除了一些多余的东西以简化问题):
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函数;但是,这也没有解决问题。您知道为什么会这样吗?什么可以解决问题?
在此先感谢您提供的任何帮助!