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