NSURLConnection sendAsynchronousRequest无法从闭包中获取variables
我试图从一个PHP页面使用POST获取简单的文本响应。 我有以下代码:
func post(url: String, info: String) -> String { var URL: NSURL = NSURL(string: url)! var request:NSMutableURLRequest = NSMutableURLRequest(URL:URL) var output = "Nothing Returned"; request.HTTPMethod = "POST"; var bodyData = info; request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding); NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()){ response, data, error in output = (NSString(data: data, encoding: NSUTF8StringEncoding))! } return output }
虽然这个代码不会抛出任何错误,但是当我这样打电话给它时:
println(post(url, info: data))
它只打印:“没有返回”即使如果我要改变线:
output = (NSString(data: data, encoding: NSUTF8StringEncoding))!
对此:
println((NSString(data: data, encoding: NSUTF8StringEncoding)))
它确实打印出适当的响应。 我在这里做我的variables有问题吗?
这是调用正在使用完成处理程序块/closures的asynchronous函数。 所以,你需要在自己的代码中使用完成处理程序模式。 这包括将方法返回types更改为Void
并添加一个新的completionHandler
闭包,这将在asynchronous调用完成时调用:
func post(url: String, info: String, completionHandler: (NSString?, NSError?) -> ()) { let URL = NSURL(string: url)! let request = NSMutableURLRequest(URL:URL) request.HTTPMethod = "POST" let bodyData = info request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding); NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { response, data, error in guard data != nil else { completionHandler(nil, error) return } completionHandler(NSString(data: data!, encoding: NSUTF8StringEncoding), nil) } }
或者,由于NSURLConnection
现在正式被弃用,所以使用NSURLSession
可能会更好:
func post(url: String, info: String, completionHandler: (NSString?, NSError?) -> ()) -> NSURLSessionTask { let URL = NSURL(string: url)! let request = NSMutableURLRequest(URL:URL) request.HTTPMethod = "POST" let bodyData = info request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding); let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in dispatch_async(dispatch_get_main_queue()) { guard data != nil else { completionHandler(nil, error) return } completionHandler(NSString(data: data!, encoding: NSUTF8StringEncoding), nil) } } task.resume() return task }
你这样称呼它:
post(url, info: info) { responseString, error in guard responseString != nil else { print(error) return } // use responseString here } // but don't try to use response string here ... the above closure will be called // asynchronously (ie later)
请注意,为了简单起见,我使用了尾随闭包语法(请参阅Swift编程语言:闭包的尾部闭合部分),但希望它能说明这个想法:您不能立即返回asynchronous方法的结果,所以提供完成处理程序闭包,将在asynchronous方法完成时调用。
- 如何在Visual C#2010 Express中debugging和发布之间切换?
- 如何使用PHP header()函数POST到页面?
- 使用msbuild指定解决scheme的项目文件
- Android版本和“等待debugging器”
- NSData和通过POST在iOS上传图片
- Web部署任务失败。 (“Microsoft.Web.Deployment.DeploymentManager”的types初始值设定项引发exception。)
- 使用gradle将artifact上传到artifactory
- 使用HttpWebRequest发布表单数据
- 如何使用Django REST框架进行POST简单的JSON? CSRF令牌丢失或不正确