2016-05-24 10 views
0

Ich brauche die Variable 'response', die aus "dataTaskWithRequest" entnommen werden kann. Momentan wird 'Antwort' nicht gefunden, da sie außerhalb der Klammern liegt. Wie kann ich sicherstellen, dass die Antwortvariable an das UIAlert übergeben wird? DankSwift UIAlert - Daten von dataTaskWithRequest abrufen

Hier ist mein Code:

@IBAction func buttonCreateAccount(sender: AnyObject) { 
      let request = NSMutableURLRequest(URL: NSURL(string: "http://www.example.com/createaccount.php")!) 
      request.HTTPMethod = "POST" 
      let postString = "user_name=\(username.text!)&email=\(email.text!)&password=\(password.text!)" 
      request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 

      let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
       data, response, error in 

       if error != nil { 
        print("error=\(error)") 
        return 
       } 

       print("response = \(response)") 

       let response = String(data: data!, encoding: NSUTF8StringEncoding) 
       print("responseString = \(response)") 

      } 

      task.resume() 

//problem is here. 'response' variable cannot be taken from above. i need it to be taken from above. 
      if response == "Username taken" { 
       if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8 
        let myAlert: UIAlertController = UIAlertController(title: "Registration", message: response, preferredStyle: .Alert) 
        myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
        self.presentViewController(myAlert, animated: true, completion: nil) 
       } else { // iOS 7 
        let alert: UIAlertView = UIAlertView() 
        alert.delegate = self 

        alert.title = "Registration" 
        alert.message = "Testing" 
        alert.addButtonWithTitle("OK") 

        alert.show() 
       } 
      } else { 
       if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8 
        let myAlert: UIAlertController = UIAlertController(title: "Registration", message: response, preferredStyle: .Alert) 
        myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
        self.presentViewController(myAlert, animated: true, completion: nil) 
       } else { // iOS 7 
        let alert: UIAlertView = UIAlertView() 
        alert.delegate = self 

        alert.title = "Registration" 
        alert.message = "Testing" 
        alert.addButtonWithTitle("OK") 

        alert.show() 
        self.dismissViewControllerAnimated(true, completion: {}); 
       } 
      } 
     } 
+1

Der Abschluss-Block (der Code, den Sie angegeben haben, unmittelbar unter 'NSURLSession.sharedSession() dataTaskWithRequest (Anfrage)' wird asynchron ausgeführt werden - es wird erst die ausgeführt werden Die Anfrage wird tatsächlich abgeschlossen, was nach Aufruf dieser Funktion wahrscheinlich mehrere Millisekunden bis einige Sekunden dauern wird Der Code unterhalb Ihres Kommentars wird ** sofort ** ausgeführt, zu diesem Zeitpunkt haben Sie keine "Antwort" mehr, mit der Sie arbeiten können Sie müssen auch den gesamten Code der Antwortverarbeitung in den Completion-Block verschieben, damit er erst ausgeführt wird, wenn die Antwort verfügbar ist. –

Antwort

2

dataTaskWithRequest läuft asynchron. Sie werden die Antwort nicht sofort erhalten. Trennen Sie es in zwei Funktionen:.

@IBAction func buttonCreateAccount(sender: AnyObject) { 
    let request = NSMutableURLRequest(URL: NSURL(string: "http://www.example.com/createaccount.php")!) 
    request.HTTPMethod = "POST" 
    let postString = "user_name=\(username.text!)&email=\(email.text!)&password=\(password.text!)" 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     data, response, error in 

     if error != nil { 
      print("error=\(error)") 
      return 
     } 

     print("response = \(response)") 

     let response = String(data: data!, encoding: NSUTF8StringEncoding) 
     print("responseString = \(response)") 

     // Now that the response is ready, call the other function to handle it 
     handleResponse(response) 
    } 

    task.resume() 
} 

func handleResponse(response: String) { 
    if response == "Username taken" { 
     if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8 
      let myAlert: UIAlertController = UIAlertController(title: "Registration", message: response, preferredStyle: .Alert) 
      myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
      self.presentViewController(myAlert, animated: true, completion: nil) 
     } else { // iOS 7 
      let alert: UIAlertView = UIAlertView() 
      alert.delegate = self 

      alert.title = "Registration" 
      alert.message = "Testing" 
      alert.addButtonWithTitle("OK") 

      alert.show() 
     } 
    } else { 
     if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8 
      let myAlert: UIAlertController = UIAlertController(title: "Registration", message: response, preferredStyle: .Alert) 
      myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
      self.presentViewController(myAlert, animated: true, completion: nil) 
     } else { // iOS 7 
      let alert: UIAlertView = UIAlertView() 
      alert.delegate = self 

      alert.title = "Registration" 
      alert.message = "Testing" 
      alert.addButtonWithTitle("OK") 

      alert.show() 
      self.dismissViewControllerAnimated(true, completion: {}); 
     } 
    } 
} 
+0

Ich bekomme Folgendes: "Wert des Typs 'NSURLResponse' kann nicht in den erwarteten Argumenttyp konvertiert werden "Schnur? '" – johnjay22113

+0

Ah ... Ich habe nicht gesehen, dass diese Antwort eine Zeichenfolge ist. Ändern Sie das Argument der Funktion in: 'func handleResponse (response: String)' –

+0

Danke. Ich bekomme das jetzt: "Wert des optionalen Typs 'String?' nicht ausgepackt, wollten Sie '!' oder '?'?" – johnjay22113