Hey guys, so I've been having a lot of trouble trying to get the async Firebase calls to work properly. I need to first fetch the Tournament data from Firestore before being able to fetch the specific Player data from Firestore. The closures are really not making sense to me and I'm trying to call fetchAllPlayers inside the fetchTournament closure but even then it gives me empty values. Can anyone help me understand the best way to wait for a closure to finish before calling another one?
Thanks!
class BracketViewModel {
let firebase = FirebaseService.shared
var tournamentID: String
var tournamentData = Tournament()
var totalPlayers = 0
var playerList: [Player] = []
init(_ tournamentID: String) {
self.tournamentID = tournamentID
self.firebase.fetchTournamentData(tournamentID) { tournament in
self.tournamentData = tournament
self.totalPlayers = tournament.numPlayers
self.fetchAllPlayers { players in
self.playerList = players
}
}
}
func fetchAllPlayers(completionHandler: @escaping (_ players: [Player]) -> Void) {
var playerList = Array(repeating: Player(), count: totalPlayers)
let queue = DispatchQueue(label: "Player Serial Queue")
print(tournamentData.players) //Players exist here
for (index, playerRef) in tournamentData.players.enumerated() { //But are empty here?
queue.sync {
print(playerRef)
firebase.fetchPlayerData(playerRef) { playerData in
playerList[index] = playerData
}
}
}
queue.async {
completionHandler(playerList)
}
}