2017-04-04 6 views
1

Ich habe ein Problem mit warten, bis ein Objekt gemacht wird, dann möchte ich meine UI aktualisieren. Wenn ich die Funktion ausführe, wird es sofort den Indexfehler erhalten, weil er versucht, Text vom ersten Objekt zu bekommen, wenn es noch nicht existiert ... Wer könnte mir helfen?Warten Sie, bis Alamofire fertig ist, Anfrage bekommen und Objekt

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

Wo versuchen Sie diesen Code? Ich meine, in der ViewDidLoad? oder wo? Alles, was Sie in der Closure 'response in' tun, wird aufgerufen, sobald die Alamofire-Anfrage abgeschlossen ist. –

Antwort

2

Verwenden Abschluss Block/Schließung.

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 

} 

Schließlich diese Methode aufrufen,

self.getMovieData(activeGenreLink: "your_link_here", completion: { 
      //updateUI 
}) 

Warum?

Da Alamofire responseJSON ist ein asynchroner Aufruf. Wenn Sie Ihre Methode getMovieData aufrufen, kehrt sie offensichtlich zurück, ohne auf das Beenden von responseJSON zu warten. Sie benötigen einen Completion-Handler, um den VC zu informieren, der getMovieData aufgerufen hat, um den Abschluss zu informieren.

Da der Alamofire responseJSON-Block im Hauptthread ausgelöst wird, können Sie die Benutzeroberfläche im Abschlussblock direkt aktualisieren, ohne den Thread ändern zu müssen.

+0

Sie müssen sich erinnern, rufen Sie die 'completion()' Schließung :) –

+0

Dosent Arbeit, ich bekomme immer noch den Index außerhalb des Bereichs Fehler. Und ich rufe den Abschlussblock richtig @ Sandeep-Bhandari – Pr0tonion

+1

@ Pr0tonion muss es sein, weil Sie das Array vor der Anfrage verwenden. Wenn Sie eine tableView verwenden, denken Sie daran, dass Sie, wenn Sie die Methode 'numberOfRows' oder' cellForIndex' implementieren, überprüfen müssen, ob Ihr Array nicht null ist. –

Verwandte Themen