2017-02-22 13 views
0

こんにちは私は多くのことを試していました。だからこそ、私の問題の良い解決策を見つけることはできません。alamofireの画像リクエストが完了するまでの待ち受け方法

問題は、1つの関数内で2つの要求があり、最初のものが終了すると、2回目のダウンロードが完了するのを待つのではなく、メインスレッドでupdateUI関数が実行されるということです。

私は間違ったことをしていますが、私の考えでは2つの要求が異なるスレッドで動作することがわかっています。そのため、最初のダウンロードが完了した後でupdateUIが起動するのはそのためです。

ディスパッチキューを使用することはできますか?私は完了ハンドラが悲しいことにどのように働いているか知りません。

私は自分のgithubページからどちらを使うべきか分かりませんでした。

重複して設定しないでください。

func getMovieData(){ 

    self.posterLoading.startAnimating() 



     //Set up URL 
     let testCall: String = "https://api.themoviedb.org/3/discover/movie?api_key=935f5ddeed3fb57e&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&page=1&with_genres=12" 

     Alamofire.request(testCall).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 

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

         Alamofire.request("http://image.tmdb.org/t/p/w1920" + posterPath).responseImage { 
          response in 
          debugPrint(response) 

          //print(response.request) 
          //print(response.response) 
          //debugPrint(response.result) 

          if var image = response.result.value { 
           image = UIImage(data: response.data!)! 

           movieObject.poster = image 
          } 
         } 



         self.movieArray.append(movieObject) 
         print("movie added") 

        }//End of for each movie 
        DispatchQueue.main.async(){ 
        print("is ready for UI") 
         self.updateUI() 
        } 

       } 


      } 

    }//End of Json request 


}//End of getmoviedata 

func updateUI(){ 
    uiMovieTitle.text = movieArray[movieIndex].title 
    uiMoviePoster.image = movieArray[movieIndex].poster 

} 

答えて

1

getMovieData funcを補完ブロックで作成してください。

func getMovieData(finished:() -> Void) { 

Alamofire.request(testCall).responseJSON { response in 
    // call me on success or failure 
    finished() 
} 

}

をして、あなたはそれをgetMovieData()

+0

ありがとうございます!しかし、私はまだ同じ問題を抱えています。私はJSONの各オブジェクトのforループで2番目のリクエストを行います。私はそれを呼び出すことを試みたが、今は働いているそれでも同じ問題。これを実装するより良い方法はありますか?基本的に私はそれぞれの映画オブジェクトのために私はその映画のポスターをダウンロードしたい – Pr0tonion

1

あなたの関数は次のようになります。二回目の呼び出しFUNC、完了ブロックで、あなたの更新のUIを呼び出すことができます。

func getMovieData(completionHandler: @escaping (_ returnedData: Dictionary<String,AnyObject>)-> Void) { 

    Alamofire.request(testCall).response { response in 
     if let JSON = response.result.value { 
      completionHandler(JSON) 
     } 

    } 
} 

そして

getMovieData(completionHandler: {(returnedData)-> Void in 
    //Do whatever you want with your returnedData JSON data. 
    //when you finish working on data you can update UI 
    updateUI() 
}) 

あなたはbtw.Youは、あなたの関数内で自分のものをやるとcompletionHandlerを呼び出すことができます呼び出すあなたの関数でデータ操作を行う必要はありませんように、あなたの関数呼び出しを見て()それの終わり。その後、関数呼び出し時にのみuiを更新することができます。

関連する問題