【问题标题】:Wait until alamofire is done getting request and making object [duplicate]等到alamofire完成获取请求并制作对象[重复]
【发布时间】:2017-04-04 10:11:01
【问题描述】:

我遇到了一个问题,就是等到一个对象制作完成,然后我想更新我的 UI。如果我运行该函数,它将立即出现索引错误,因为它试图从第一个对象不存在时获取一些文本......谁能帮助我?

func getMovieData(activeGenreLink: String){

    //self.posterLoading.startAnimating()

        Alamofire.request(activeGenreLink).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
            var test = 0
            self.movieArray = []


            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)
                        }



                        self.movieArray.append(movieObject)


                    }//End of for each movie
                }

            }


    }//End of Json request



}//End of getmoviedata

【问题讨论】:

  • 您在哪里尝试此代码?我的意思是,在 viewDidLoad 内部?还是在哪里?一旦 alamofire 请求完成,您在闭包 response in 内所做的一切都会被调用。

标签: ios swift alamofire


【解决方案1】:

使用完成块/闭包。

func getMovieData(activeGenreLink: String,completion : ()->()){

    //self.posterLoading.startAnimating()

        Alamofire.request(activeGenreLink).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
            var test = 0
            self.movieArray = []


            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)
                        }



                        self.movieArray.append(movieObject)


                    }//End of for each movie
                }

            }

           completion()
    }//End of Json request

}

终于调用了这个方法,

self.getMovieData(activeGenreLink: "your_link_here", completion: {
            //updateUI
})

为什么?

因为 Alamofire responseJSON 是异步调用。当您调用您的方法 getMovieData 时,显然它会返回而无需等待 responseJSON 完成。您需要一个完成处理程序来通知调用getMovieData 的VC 来通知它的完成。

由于Alamofire responseJSON 块是在主线程上触发的,因此您可以直接在完成块中更新UI,而无需更改线程。

【讨论】:

  • 你必须记得调用completion()闭包:)
  • Dosent 工作,我仍然得到索引超出范围错误。我正确地调用了完成块@Sandeep-Bhandari
  • @Pr0tonion 一定是因为您在执行请求之前正在使用数组。如果您使用的是 tableView,请记住您在哪里实现 numberOfRowscellForIndex 方法,如果您的数组不为空,则必须检查。
  • 尝试在 responseJSON 方法中放置断点并检查您是否真的获得了任何数据,如果是,请检查 self.movi​​eArray 计数。这个崩溃到底发生在哪里粘贴代码
  • @Aitor Pagán : Bingo
猜你喜欢
  • 1970-01-01
  • 2014-07-25
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多