2016-05-12 10 views
0

Ich versuche, diesen Completion-Handler zu finden, aber ich kann mich einfach nicht darum kümmern. Ich habe dieses Programm, das ich versuche, eine JSON-Datei herunterzuladen und zu analysieren. Alles funktioniert gut, aber ich möchte, dass die Benutzeroberfläche aktualisiert wird, nachdem die Datei heruntergeladen und analysiert wurde. Ich muss den Knopf zweimal drücken, um es zur Arbeit zu bringen. Ich weiß, warum das passiert. Der Code arbeitet im asynchronen Stil und geht einfach um die Benutzeroberfläche mit nichts zu aktualisieren. Wie kann ich dafür sorgen, dass der JSON das Parsen und Herunterladen beendet? Vielen Dank für jede Hilfe und Tipps zu diesemSwift completion handeler Ausgabe

Dies ist, was ich bisher:

@IBAction func testerClick(sender: AnyObject) { 


    print("Button pushed") 

    print("Downloading the json file") 
    downlaodPromoData(promoUrl, myUser: myUserName, myPass: myPassword) 



} 

func parsePromoJson(json : String) 
{ 
    //parse the json file 
    if let data = downloadJson.dataUsingEncoding(NSUTF8StringEncoding) { 
     let json = JSON(data: data) 
     for item in json[].arrayValue { 
      pictures.append(item["picture"].stringValue) 
     } 
     for item in json[].arrayValue{ 
      path.append(item["path"].stringValue) 
     } 
     for item in json[].arrayValue{ 
      label.append(item["label"].stringValue) 
     } 
    } 
    // Loop over the array with a for-loop. 
    for i in 0 ..< pictures.count { 
     uiResultsTextField.text.appendContentsOf("Picture: " + pictures[i] + "\n" + "Path: " + path[i] + "\n" + "Label: " + label[i] + "\n") 
    } 

} 

func downlaodPromoData(myUrl : String, myUser : String, myPass : String) 
{ 
    Alamofire.request(.GET, myUrl) 
     .authenticate(user: myUser, password: myPass) 
     .validate(statusCode: 200..<300) 
     .responseString { response in 
      print("Success: \(response.result.isSuccess)") 
      print("Response String: \(response.result.value)") 

      self.downloadJson = response.result.value! 

      /* 
      .response {(request, response, data, error) in 
      print(response) 
      print(data) 
      print(request) 
      */ 
     }.responseJSON { response in 
      print("Response JSON: \(response.result.value)") 
    } 

    print("Calling parser") 
    parsePromoJson(downloadJson) 
} 
+1

versuchen Sie, den Aufruf von 'parsePromoJson()' innerhalb des Callbacks '.responseString' zu verschieben, direkt nach der Zeile 'self.downloadJson = response.result.value!' – pbodsk

+1

Danke, dass dein Vorschlag richtig war. Danke für Ihre Hilfe – MNM

Antwort

4

Sie die parsePromoJson unmittelbar nach der Anfrage aufrufen. Verschieben Sie den parsePromoJson-Aufruf in den responseString-Block der Alamofire-Anforderung.

+1

Arbeitete wie ein Charme. Ich hatte diesen Codeabschnitt überall nur nicht richtig unter der richtigen Stelle. Vielen Dank – MNM