2016-03-18 3 views
1

J'ai essayé de créer une classe d'assistance pour ma demande POST et je souhaite renvoyer la réponse. Cependant, comme la demande de publication est asynchrone, cela m'a fait me sentir un peu confus.Utilisation d'une fonction d'aide pour la demande POST

J'ai essayé de retourner NSString mais il ne m'a pas laissé retourner ni response ni responseString. Il m'a juste laissé mettre return "A". J'ai essayé d'utiliser -> NSURLResponse mais je ne pouvais pas le faire fonctionner non plus.

Quelle est la bonne façon de faire une telle méthode? (Il est aussi très bien si je fais un chèque après que je reçois une réponse, et retourne vrai ou faux selon la réponse)

class func hello(name: String) -> NSString { 

    let request = NSMutableURLRequest(URL: NSURL(string: "http://www.thisismylink.com/postName.php")!) 
    request.HTTPMethod = "POST" 
    let postString = "Hi, \(name)" 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
     guard error == nil && data != nil else {               // check for fundamental networking error 
      print("error=\(error)") 
      return 
     } 

     if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 {   // check for http errors 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(response)") 

     } 

     let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("responseString = \(responseString)") 
    } 
    task.resume() 
    return "A" 
} 

Répondre

5

Depuis dataTaskWithRequest est asynchrone, la fonction frappera votre relevé de retour avant que le bloc d'achèvement est exécuté. Ce que vous devez faire est soit de configurer un bloc d'achèvement pour votre propre méthode d'assistance, soit de passer une sorte d'objet délégué à la fonction afin que vous puissiez appeler une méthode dessus pour lui faire savoir quel était le résultat du rappel de service web.

Voici un exemple en utilisant un bloc d'achèvement:

class func hello(name: String, completion: (String? -> Void)){ 

    let request = NSMutableURLRequest(URL: NSURL(string: "http://www.thisismylink.com/postName.php")!) 
    request.HTTPMethod = "POST" 
    let postString = "Hi, \(name)" 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
     guard error == nil && data != nil else {               // check for fundamental networking error 
      print("error=\(error)") 
      return 
     } 

     if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 {   // check for http errors 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(response)") 

     } 

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

     completion(responseString); 
    } 
    task.resume() 
} 

puis de l'utiliser

<#YourClass#>.hello("name") { responseString in 

    //do something with responseString 
} 

havent testé le code, mais devrait être à peu près juste

+0

Wow! Ace homme !! Merci!!! – senty

+1

note le changement de ligne 'let responseString = Chaîne (données: données!, Codage: NSUTF8StringEncoding)' changé NSString en chaîne pour être plus swifty – Fonix

+1

Notez également que je n'ai inclus aucun code de gestion des erreurs, vous êtes seul pour savoir comment gérer cette – Fonix