2017-12-22 1 views
0

Ich möchte eine Alamofire-Anforderung ausführen, die das Ergebnis einer vorherigen Alamofire-Anforderung als Parameter verwendet. Um es einfach:Führen Sie die Alamofire-Anforderung nach Abschluss einer anderen Alamofire-Anforderung aus.

//Code1 
    Alamofire.request("URL", method: HTTPMethod.post, parameters: ["id": id as NSString)], encoding: URLEncoding.httpBody).response(completionHandler: { (response) in 
     let json = response.data 
     do { 
      print("This should be First") 
      let data = try JSON(data: json!) 
      let alllastmessages = data["Messages"].arrayValue 
      for i in 0..<alllastmessages.count { 
       self.List.append(alllastmessages[i]["message"].stringValue) 
      }} 
     catch _{} 
    }) 
    //End Code1 

    //Code2 
    print("This should be Last") 
    for i in 0..<List.count { 
     Alamofire.request("URL2", method: .post , parameters: ["id": id as NSString] , encoding: URLEncoding.httpBody).response(completionHandler: { (response) in 
      //Do Something 
     }) 
     self.tableView.reloadData() 
    } 
    //End Code2 

(Dieser Code vereinfacht ist, bin ich nur nach einem Weg suchen Code1 vor Code2 laufen zu machen)

Antwort

1

IMO Der einfachste Weg ist DispatchGroup zu verwenden, können Sie mehr darüber lesen hier: https://developer.apple.com/documentation/dispatch/dispatchgroup

hier ist ein Code, der gut für mich funktioniert:

DispatchQueue.global(qos: .userInitiated).async { 
     let group = DispatchGroup() 
     group.enter() 

     print("\(Date()) Start request 1!") 
     Alamofire.request("https://github.com/CosmicMind/Material", 
          method: .get , 
          parameters: [:] , encoding: URLEncoding.httpBody).response(completionHandler: { (response) in 
          print("\(Date()) Request 1 completed!") 
          group.leave() 
          }) 

     group.wait() 

     print("\(Date()) Start request 2!") 
     Alamofire.request("https://github.com/CosmicMind/Material", 
          method: .get , 
          parameters: [:] , encoding: URLEncoding.httpBody).response(completionHandler: { (response) in 
          print("\(Date()) Request 2 completed!") 
          }) 
    } 

Drucke:

2017-12-22 18:24:45 +0000 Start request 1! 
2017-12-22 18:24:47 +0000 Request 1 completed! 
2017-12-22 18:24:47 +0000 Start request 2! 
2017-12-22 18:24:49 +0000 Request 2 completed! 
+0

Ihre für Ihre Antwort danken, aber diese Lösung hat nicht funktioniert, weil es die Gruppe Eingabe> überspringen Alamofire (da läuft es letzten)> Ausführen group.wait() und wartet für immer. – Gintal

+0

Können Sie den genauen Code anzeigen, den Sie verwendet haben? Ich habe mein Beispiel mit Code aktualisiert, den ich selbst ausgeführt habe, und was ich gesehen habe, funktionierte gut. – netigger

+0

Funktioniert jetzt gut, vielen Dank. Mir fehlte "DispatchQueue.global (qos: .userInitiated) .async" – Gintal

0

Der einfachste Weg ist, Ihre Anrufe zu verschachteln. Sie können innerhalb der Rückruf für den ersten, die zweiten Anruf nennen, etwa so:

Alamofire.request("URL", method: HTTPMethod.post, parameters: ["id": id as NSString)], encoding: URLEncoding.httpBody).response(completionHandler: { (response) in 
    let json = response.data 
    do { 
     print("This should be First") 
     let data = try JSON(data: json!) 
     let alllastmessages = data["Messages"].arrayValue 
     for i in 0..<alllastmessages.count { 
      self.List.append(alllastmessages[i]["message"].stringValue) 
     } 
     //End Code1 

     //Code2  
     print("This should be Last") 
     for i in 0..<List.count { 
      Alamofire.request("URL2", method: .post , parameters: ["id": id as NSString] , encoding: URLEncoding.httpBody).response(completionHandler: { (response) in 
       //Do Something 
      }) 
      self.tableView.reloadData() 
     } 
    //End Code2 
    } catch _{} 
}) 
Verwandte Themen