2017-02-22 5 views
0

Здравствуйте, я много старался и оглядывался, но я не могу найти хорошее решение моей проблемы.Как подождать, пока запрос изображения alamofire будет выполнен

Проблема в том, что я делаю 2 запроса в пределах одной функции, а первая заканчивается, а затем выполняет функцию updateUI в основном потоке, а не ждет завершения второй загрузки.

Я знаю, что я делаю что-то неправильно, но, на мой взгляд, два запроса работают на разные потоки, и поэтому updateUI запускается только после завершения первой загрузки.

Можно ли использовать dispatchqueue? Я не знаю, как обработчики завершения работают либо печально.

Я не мог видеть, что я должен использовать со своей страницы github, im, совершенно новый в Swift.

Не указывайте это как дубликат. бы очень признателен,

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

}

, а затем вы можете позвонить интерфейс обновления в завершение блока FUNC, где вы вызывающему его во второй раз getMovieData()

+0

Да, спасибо! Но у меня все еще такая же проблема. я делаю второй запрос в цикле for для каждого объекта в JSON. Я попробовал позвонить, но теперь работает. Все та же проблема. Есть ли лучший способ реализовать это? В основном я хочу для каждого фильма-объекта, который я хочу, чтобы загрузить плакат для этого фильма – Pr0tonion

1

Ваша функция должна выглядеть следующим образом.

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 только при вызове функции.