Проблемы с получением нескольких вызовов asyn c для работы с помощью DispatchGroups - PullRequest
0 голосов
/ 09 июля 2020

Мое представление таблицы не заполняется после asyn c (api) вызовов fini sh. Второй вызов asyn c внутри for l oop требует выполнения первого вызова asyn c перед выполнением (он зависит от него, поскольку использует из него массив mov ie). Кажется, я не могу понять, как правильно выполнить эту работу и заставить мои переменные сохраняться из вызовов asyn c, чтобы перейти к моему tableview после exeting DispatchQueue.main.async. Вот мой код:

    let dispatchGroup = DispatchGroup()
    
    DispatchQueue.main.async
    {
        dispatchGroup.enter()
        GenresMDB.genre_movies(genreId: categoryNum[genre], include_adult_movies: true, language: "en") //first async call
        { [weak self] apiReturn, movieList in
            
            guard let self = self else {return}
                   
            if let movies = movieList
            {
                for movie in movies
                {
                    self.movies.append(MovieDT(title: movie.title ?? "Missing Title", description: movie.overview ?? " ", releaseDate: movie.release_date ?? " ", stars: movie.vote_average ?? 0, id: movie.id ?? 0))
                }
            }
                
            dispatchGroup.leave()
                
            for movie in self.movies
            {
                dispatchGroup.enter()
                self.db.collection("Movies").document(String(movie.id)).getDocument() //second async call (multiple calls) -> this needs the first async call above to be finished
                { [weak self] (querySnapshot, err) in
                    guard self == self else {return}
                    if let err = err {
                        print("Error getting documents: \(err)")
                                    }
                    else
                    {
                        guard let snap = querySnapshot else {return}
                        let data = snap.data()
                        self!.upvoteCount.append((data?["upvoteCount"] as? Int ?? 0) - (data?["downvoteCount"] as? Int ?? 0))
                    }
                    dispatchGroup.leave()
                }
            }
        }
    }
    
    dispatchGroup.notify(queue: DispatchQueue.main) {
        print("Async calls finished")
        self.tableView.reloadData()
    }

1 Ответ

0 голосов
/ 09 июля 2020

Это должно работать как те, хотя я не думаю, что это правильный способ сделать это.

let dispatchGroup = DispatchGroup() 
    DispatchQueue.main.async
    {
        dispatchGroup.enter()
        GenresMDB.genre_movies(genreId: categoryNum[genre], include_adult_movies: true, language: "en") //first async call
        { [weak self] apiReturn, movieList in
            
            guard let self = self else {return}
                   
            if let movies = movieList
            {
                for movie in movies
                {
                    self.movies.append(MovieDT(title: movie.title ?? "Missing Title", description: movie.overview ?? " ", releaseDate: movie.release_date ?? " ", stars: movie.vote_average ?? 0, id: movie.id ?? 0))
                }
            }
                
            dispatchGroup.leave()
            self.tableView.reloadData()
        
            for movie in self.movies
            {
                dispatchGroup.enter()
                self.db.collection("Movies").document(String(movie.id)).getDocument() //second async call (multiple calls) -> this needs the first async call above to be finished
                { [weak self] (querySnapshot, err) in
                    guard self == self else {return}
                    if let err = err {
                        print("Error getting documents: \(err)")
                                    }
                    else
                    {
                        guard let snap = querySnapshot else {return}
                        let data = snap.data()
                        self!.upvoteCount.append((data?["upvoteCount"] as? Int ?? 0) - (data?["downvoteCount"] as? Int ?? 0))
                        print((data?["upvoteCount"] as? Int ?? 0) - (data?["downvoteCount"] as? Int ?? 0))
                    }
                    dispatchGroup.leave()
                    self!.tableView.reloadData()
                }
            }
        } //why does it have to end it all the way here for it to work?
    }
    
    dispatchGroup.notify(queue: DispatchQueue.main) {
        print("Async calls finished")
        self.tableView.reloadData()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...