0

您好,我一直在尝试并在 SO 上四处寻找,但我找不到解决问题的好方法。

问题是我在一个函数中执行了 2 个请求,第一个请求完成,然后它在主线程上执行 updateUI 函数,而不是等待第二个下载完成。

我知道我做错了什么,但在我看来这两个请求在不同的线程上工作,这就是为什么 updateUI 只会在第一次下载完成后触发。

是否可以使用调度队列?我也不知道完成处理程序是如何工作的。

我也无法从他们的 github 页面上看到我必须使用的东西,我在 Swift 上还是个新手。

请不要将此设置为重复。真的很感激

func getMovieData(){

    self.posterLoading.startAnimating()



        //Set up URL
        let testCall: String = "https://api.themoviedb.org/3/discover/movie?api_key=935f5ddeed3fb57e&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&page=1&with_genres=12"

        Alamofire.request(testCall).responseJSON { response in
            //print(response.request)  // original URL request
            //print(response.response) // HTTP URL response
            //print(response.data)     // server data
            //print(response.result)   // result of response serialization

            if let json = response.result.value as? Dictionary<String,AnyObject> {
                if let movies = json["results"] as? [AnyObject]{
                    for movie in movies{
                        let movieObject: Movie = Movie()

                        let title = movie["title"] as! String
                        let releaseDate = movie["release_date"] as! String
                        let posterPath = movie["poster_path"] as! String
                        let overView = movie["overview"] as! String
                        let movieId = movie["id"] as! Int
                        let genre_ids = movie["genre_ids"] as! [AnyObject]

                        movieObject.title = title
                        movieObject.movieRelease = releaseDate
                        movieObject.posterPath = posterPath
                        movieObject.overView = overView
                        movieObject.movieId = movieId


                        for genre in genre_ids{//Genre ids, fix this
                            movieObject.movieGenre.append(genre as! Int)
                        }

                        Alamofire.request("http://image.tmdb.org/t/p/w1920" + posterPath).responseImage {
                            response in
                            debugPrint(response)

                            //print(response.request)
                            //print(response.response)
                            //debugPrint(response.result)

                            if var image = response.result.value {
                                image = UIImage(data: response.data!)!

                                movieObject.poster = image
                            }
                        }



                        self.movieArray.append(movieObject)
                        print("movie added")

                    }//End of for each movie
                    DispatchQueue.main.async(){
                    print("is ready for UI")
                        self.updateUI()
                    }

                }


            }

    }//End of Json request


}//End of getmoviedata

func updateUI(){
    uiMovieTitle.text = movieArray[movieIndex].title
    uiMoviePoster.image = movieArray[movieIndex].poster

}
4

2 回答 2

1

只需getMovieData使用完成块制作您的功能。

func getMovieData(finished: () -> Void) {

 Alamofire.request(testCall).responseJSON { response in
     // call me on success or failure
     finished()
 }

}

然后你可以在函数的完成块中调用你的更新 UI,在那里你第二次调用它getMovieData()

于 2017-02-22T13:08:23.653 回答
1

你的函数应该是这样的。

func getMovieData(completionHandler: @escaping (_ returnedData: Dictionary<String,AnyObject>)-> Void ) {

    Alamofire.request(testCall).response { response in
        if let JSON = response.result.value {
           completionHandler(JSON)
        }

    }
}

你的函数调用看起来像

getMovieData(completionHandler: {(returnedData)-> Void in
     //Do whatever you want with your returnedData JSON data.
     //when you finish working on data you can update UI
     updateUI()
})

您不必在函数调用 btw 中执行数据操作。您可以在函数中执行您的操作并调用 completionHandler() 结束。然后,您只能在函数调用时更新您的 ui。

于 2017-02-22T13:20:36.573 回答