Последовательность замыканий идет не так, как я ожидал - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть два разных класса данных в базе данных Firebase, которые мне нужно объединить в один класс для определенного фида в моем приложении. Поэтому я использовал замыкания для пошагового процесса получения информации из базы данных, манипулирования ею и объединения в один массив. Моя функция, которая получает все данные, работает нормально, но мне нужно, чтобы эта функция вызывалась первой, а затем происходили x, y и z ... проблема в том, что сначала вызывается неправильная функция, хотя я пытаюсь использовать обработчики завершения. Пожалуйста, помогите, если я делаю что-то не так. Заранее спасибо.

Вот функция, которую нужно сначала запустить, чтобы получить все данные из Firebase:

func getUserLeagues(_ completion: ()->()) {

    userLeagues.getGolferLeagues {
        print("Step 1")
        for league in self.userLeagues.leagues {
            print("FOR IN League ID: \(league.leagueID)")
            self.getLeagueInfo(leagueID: league.leagueID, completion: {
                print("Step 2")

            })
        }
        print("League Info Code Run")

    }
    completion()
}


//Get league Info
func getLeagueInfo(leagueID: String, completion: @escaping ()->()) {
    REF_leagueInfo.child(leagueID).observe(.value, with: {(snapshot) in
        if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] {
            self.leagueInfo.removeAll()
            for snap in snapshot {
                print("SNAP: \(snap)")

                if let leagueDict = snap.value as? Dictionary<String, Any> {
                    let key = snap.key
                    let league = LeagueInfo(leagueID: key, leagueDict: leagueDict)
                    self.leagueInfo.append(league)
                }
            }

        }
        completion()
    })
}

}

А вот и функция, которая вызывается при загрузке VC и требует, чтобы первая функция вызывалась первой, прежде чем что-либо еще можно будет запустить.

func getSummaryLeaderboard(completion: @escaping ()->()) {
    self.summaryLeaderBoards.removeAll()
    print("Get Summary Leaderboard called")

    leagueInfo.getUserLeagues {
        print("Step 3")
        print("League Count: \(self.userLeagues.leagues.count)")
        for league in self.userLeagues.leagues {


            print("League ID: \(league.leagueID)")
            self.leagueInfo.getLeagueInfo(leagueID: league.leagueID, completion: {
                let leagueInfoIndex = self.leagueInfo.leagueInfo[0]
                self.leagueEndDate = leagueInfoIndex.endDate
                print("league end date: \(self.leagueEndDate)")
                self.leagueImg = leagueInfoIndex.leagueImage
                print("league img: \(self.leagueImg)")
                self.leagueName = leagueInfoIndex.leagueName
                print("league Name: \(self.leagueName)")
                self.minRounds = leagueInfoIndex.leagueMinRounds
                print("league min rounds: \(self.minRounds)")
                self.leagueLeaderScore = leagueInfoIndex.leaderPardieScore
                print("league leader score: \(self.leagueLeaderScore)")
                print("League info run")

            })


            self.leagueMembers.getLeagueMembers(leagueID: league.leagueID, completion: {
                print("GET LEAGUE MEMBERS RUN")
                self.roundsRemaining = self.fillInRoundsRemaing(minRounds: self.minRounds, roundsPlayed: self.leagueMembers.getUserRounds(userID: currentUserKey))
                print("user rounds remaining: \(self.roundsRemaining)")
                self.userPosition = self.getCurrentUserPosition(userID: currentUserKey)
                print("user position: \(self.userPosition)")
                self.roundsPlayed = self.leagueMembers.getUserRounds(userID: currentUserKey)
                print("user rounds played: \(self.roundsPlayed)")
                self.totalMembers = self.leagueMembers.leagueMembers.count
                print("user total members: \(self.totalMembers)")
                self.userWinnings = self.getCurrentUserWinnings(userID: currentUserKey)
                print("USER WINNINGS: \(self.userWinnings)")
                self.userPardieScore = self.leagueMembers.getUserPardieScore(userID: currentUserKey)
                print("user pardie Score: \(self.userPardieScore)")

                let newSummaryLeaderboard = SummaryLeaderboard(leagueEndDate: self.leagueEndDate, roundsRemaining: self.roundsRemaining, leagueImg: self.leagueImg, leagueName: self.leagueName, userPosition: self.userPosition, leagueLeaderScore: self.leagueLeaderScore, userWinnings: self.userWinnings, roundsPlayed: self.roundsPlayed, totalMembers: self.totalMembers, userPardieScore: self.userPardieScore)
                self.summaryLeaderBoards.append(newSummaryLeaderboard)
                completion()
            })

        }
    }

Вы увидите мои комментарии, которые говорят Шаг 1, Шаг 2 и Шаг 3 ... Очевидно, мне нужно, чтобы они запустили 1 2 3 ... Сейчас они запускают 3,1,2, и я не могу понять, почему ..

Еще раз спасибо! Это сводит меня с ума уже несколько дней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...