2017-04-04 59 views
1

我在等待一个对象生成时遇到问题,然后我希望更新我的UI。如果我运行该函数,它会立即得到索引错误,因为它试图从第一个对象获得一些文本,当它存在dosent时......任何人都可以帮助我?等到alamofire完成请求并创建对象

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 
+0

你在哪里试这个代码?我的意思是,在viewDidLoad里面?或在哪里?一旦你完成了alamofire请求,你会在''response'里面做的所有事情都会被调用。 –

回答

2

使用完成块/关闭。

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完成就返回。你需要一个完成处理程序通知VC调用getMovieData来通知完成它。

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

+0

你必须记得调用'completion()'closure :) –

+0

Dosent work,我仍然得到索引超出范围的错误。并且我正确地调用完成块@ Sandeep-Bhandari – Pr0tonion

+1

@ Pr0tonion它一定是因为您在请求之前使用数组。如果您使用的是tableView,请记住您在哪里实现'numberOfRows'或'cellForIndex'方法,您必须检查数组是否为空。 –