2017-01-31 5 views
0

Ich verwende Alamofire, um eine Anzahl von asynchronen Anfragen gleichzeitig auszuführen, und SwiftyJSON, um die Antwort zu behandeln.Asynchrone Anfrage (Bestellung wichtig)

Ich brauche Hilfe, um sicher zu stellen, dass das Anfügen an moviesByCategory in der Reihenfolge auftritt.

Zum Beispiel sollte die Datenantwort "top_rated" das erste an moviesByCategory angehängte Element sein, nicht "anstehend".

var moviesByCategory = [[JSON]]()  

override func viewDidLoad() { 
    super.viewDidLoad() 

    let apiEndPoints = ["top_rated", "popular", "now_playing", "upcoming"] 
    let dispatchGroup = DispatchGroup() 

    for endPoint in apiEndPoints { 
     let endPointURL = URL(string: "https://api.themoviedb.org/3/movie/\(endPoint)?api_key=\(apiKey)&language=en-US&page=1")! 
     dispatchGroup.enter() 
     getMoviesFromEndPoint(url: endPointURL) 
    } 

    dispatchGroup.notify(queue: DispatchQueue.main) { 
     self.tableView.reloadData() 
    } 
} 

func getMoviesFromEndPoint(url: URL, group: dispatchGroup) { 
    Alamofire.request(url).responseData { response in 
     if let data = response.result.value { 
      let json = JSON(data: data) 
      self.moviesByCategory.append(json["results"].arrayValue) 
     } 
    } 
} 

Der Zweck DispatchGroup ist die UITableView neu zu laden, sobald alle Anforderungen abgeschlossen haben.

Jede Hilfe mit diesem würde sehr geschätzt werden. Bitte weisen Sie darauf hin, wo ich falsch liege.

Antwort

0

einen Abschluss Handler Parameter getMoviesFromEndPoint hinzufügen:

func getMoviesFromEndPoint(url: URL, completion:() -> Void) { ... } 

und die Gruppe verlassen innerhalb nachdem der Netzanruf beendet:

getMoviesFromEndPoint(url: endPointURL) { 
    dispatchGroup.leave() 
} 

komplette Code:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let apiEndPoints = ["top_rated", "popular", "now_playing", "upcoming"] 
    let dispatchGroup = DispatchGroup() 

    for endPoint in apiEndPoints { 
     let endPointURL = URL(string: "https://api.themoviedb.org/3/movie/\(endPoint)?api_key=\(apiKey)&language=en-US&page=1")! 
     dispatchGroup.enter() 
     getMoviesFromEndPoint(url: endPointURL) { 
      dispatchGroup.leave() 
     } 
    } 

    dispatchGroup.notify(queue: DispatchQueue.main) { 
     self.tableView.reloadData() 
    } 
} 

func getMoviesFromEndPoint(url: URL, completion:() -> Void) { 
    Alamofire.request(url).responseData { response in 
     if let data = response.result.value { 
      let json = JSON(data: data) 
      self.moviesByCategory.append(json["results"].arrayValue)     
     } 
     completion() 
    } 
} 
Verwandte Themen