2017-04-04 7 views
1

オブジェクトが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リクエストが完了すると、あなたが閉じた '応答 'の中で行うすべてのことが呼び出されます。 –

答えて

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()'クロージャーを覚えていなければなりません:) –

+0

Dosentの仕事は、私はまだ範囲外のインデックスのインデックスを取得します。そして私は完了ブロックを正しく呼んでいます@ Sandeep-Bhandari – Pr0tonion

+1

@ Pr0tonion要求を行う前に配列を使用しているからです。 tableViewを使用している場合は、メソッド 'numberOfRows'または' cellForIndex'を実装する場所で、配列がnullでないかどうかを確認する必要があります。 –

関連する問題