2016-06-05 3 views
0

Ich habe diesen Code:Ist es möglich, von POST Aufruf Ergebnismenge zurück

private func data_request(url : String) 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 

    let url:NSURL = NSURL(string: self.self.newUrl.createUrl(url))! 
    let session = NSURLSession.sharedSession() 

    let request = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "POST" 
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

    let paramString = "data=Hello" 
    request.HTTPBody = paramString.dataUsingEncoding(NSUTF8StringEncoding) 

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

     guard let _:NSData = data, let _:NSURLResponse = response where error == nil else { 
      print("error") 
      return 
     } 

     let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding) 

    } 

     task.resume() 
    } 
} 

ich es so nennen: var result = data_request("localhost/test");

Das funktioniert prima, aber ist es möglich, die Ergebnisse zurück von der Anfragefunktion? Mein Plan ist, das Ergebnis in die Ergebnisvariable zu bringen.

+2

BTW, gibt es keine Notwendigkeit für 'dispatch_async' zur globalen Warteschlange. 'NSURLSession' ist bereits asynchron. – Rob

Antwort

4

Sie sollten Closures verwenden, um die Daten zu erhalten, da die API NSURLSession asynchron ist, was bedeutet, dass Sie nicht wissen, wann die Daten eintreffen werden. Es kann sofort oder in 10 Sekunden sein, du weißt es nie. Sie werden sofort von der Funktion zurückkehren, aber Sie erhalten den Wert aus der Schließung.

private func data_request(url : String, completion: (String) ->()) { 
    //... 
    //... 
    let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
    // Now call completion to pass the value 
    completion(dataString) 
} 

Und wenn Sie die Funktion aufrufen müssen, die Sie verwenden:

data_request("http://someapi.com/api") { 
    dataString in 
    print(dataString) // This is the string you passed to the completion 
} 
+0

Ja, das ist die Art und Weise, dies zu tun (obwohl ich vorschlagen würde, 'String' Parameter der Schließung optional und' guard' gegen 'nil' Wert für' Data' und/oder String-Codierung Fehler). Netzwerkanfragen können aus Gründen, die außerhalb unserer Kontrolle liegen, fehlschlagen, und wir möchten sie ordnungsgemäß behandeln. – Rob

Verwandte Themen