我在等待一个对象制作完成后遇到问题,然后我希望更新我的用户界面。如果我运行该函数,它将立即出现索引错误,因为它试图从第一个对象中获取一些文本,而该对象尚不存在......任何人都可以帮助我吗?
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
使用完成块/闭包。
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
})
Why?
因为Alamofire的responseJSON是异步调用。当你调用你的方法时getMovieData
显然它返回而不等待responseJSON完成。您需要一个完成处理程序来通知 VC 调用了getMovieData
通知其完成。
由于 Alamofire responseJSON 块是在主线程上触发的,因此您可以直接在完成块中更新 UI,而无需更改线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)