2017-04-04 28 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'方法,您必須檢查數組是否爲空。 –