Swift – 在发送POST请求时从NSURLSession返回数据

我可以使用下面的代码在Swift中发送一个POST请求

func post() -> String{ let request = NSMutableURLRequest(URL: NSURL(string: "http://myserverip/myfile.php")!) request.HTTPMethod = "POST" let postString = "data=xxxxxxx" request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in if error != nil { println("error=\(error)") return } println("response = \(response)") let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) println("responseString = \(responseString!)") } task.resume() return "";//how would i return data here } 

我需要返回结果,但这是不可能的,因为networking请求是asynchronous的。 我想我可以使用一个监听器等待结果,然后返回它,但我不知道这将如何工作,或如何实现它如果有人可以帮助,我将不胜感激,我是新来的iOS和Swift

您的发布function可能是这样的:

 func post(completionHandler: (response: String) -> ()) { your code } 

而在回应部分:

 let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) completionHandler(response: responseString) 

最后,你可以调用你的post方法,如:

 post( {(response: String) -> () in println("response = \(response)")}) 

您可以使用委托或传递一个函数作为您在最后调用的post的参数

完成处理程序的示例:

  struct RemoteCenter { static func post(completion: (message: String?) -> Void) { let request = NSMutableURLRequest(URL: NSURL(string: "http://myserverip/myfile.php")!) request.HTTPMethod = "POST" let postString = "data=xxxxxxx" request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in if error != nil { println("error=\(error)") return } completion(message: NSString(data: data, encoding: NSUTF8StringEncoding) as? String) } task.resume() } } class YourController: UIViewController { override func viewDidLoad() { RemoteCenter.post(completionHandler) } func completionHandler(message: String?){ println("I got \(message)") } } 

代表示例:

 protocol DelegateProtocol { func didReceiveAMessage(message: String?) } struct RemoteCenter { var delegate:DelegateProtocol? func post() { let request = NSMutableURLRequest(URL: NSURL(string: "http://myserverip/myfile.php")!) request.HTTPMethod = "POST" let postString = "data=xxxxxxx" request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in if error != nil { println("error=\(error)") return } self.delegate?.didReceiveAMessage(NSString(data: data, encoding: NSUTF8StringEncoding) as? String) } task.resume() } } class YourController: UIViewController, DelegateProtocol { var remote = RemoteCenter() override func viewDidLoad() { remote.delegate = self remote.post() } func didReceiveAMessage(message: String?) { println("I got \(message)") } } 

在这两种情况下,目标是从UIViewController获取互联网上的一些数据,并在完成时打印消息。

你可以find这么多的教程。 检查http://www.raywenderlich.com