2017-02-22 108 views
0

你好,我一直在嘗試很多,四處尋找,但我無法找到一個很好的解決方案,我的問題。如何等待,直到alamofire圖像請求完成

問題是我在一個函數中做了2個請求,並且第一個函數完成了,然後它在主線程上執行了updateUI函數,而不是等待第二個下載完成。

我知道我做錯了什麼,但在我看來,這兩個請求在不同的線程上工作,這就是爲什麼updateUI只會在第一次下載完成後觸發。

是否可以使用dispatchqueue?我不知道如何completionhandlers工作或者悲哀..

我不能看到我有什麼要從他們的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 getMovieData(finished:() -> Void) { 

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

}

,然後你可以調用FUNC,在那裏你調用它的第二次getMovieData()

+0

是啊,謝謝!但我仍然有同樣的問題。我在for循環中爲JSON中的每個對象執行第二個請求。我試過叫它,但現在工作。仍然是同樣的問題。有沒有更好的方法來實現這一點?基本上,我想爲每個電影對象,我讓我也想下載該電影的海報 – Pr0tonion

1

你的功能應該是這樣完成的塊更新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。