NSURLSession 响应字符串完成块 - Swift
Posted
技术标签:
【中文标题】NSURLSession 响应字符串完成块 - Swift【英文标题】:NSURLSession Response String completion block - Swift 【发布时间】:2015-07-15 16:06:44 【问题描述】:我想在调用下一个函数“nextScreen()”(segue)之前等待 responseString 完成。目前我有一个 if 语句来确保它在继续之前不为零,但有时会调用下一个函数/segue,因为 responseString 仍在下载。
你能帮忙做一个完成块吗?我找到了 NSURLSession 的完成块,但这些只是等待初始 HTTP 调用完成,而不是响应字符串。
func getProfiles()
func post(completion: (message: String?) -> Void)
let request = NSMutableURLRequest(URL: NSURL(string: "http://**.**.**.**/EPG/XML/QueryProfile")!)
request.HTTPMethod = "POST"
let postString = "<QueryProfileReq><type>1</type></QueryProfileReq>"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task: Void = NSURLSession.sharedSession().dataTaskWithRequest(request,
completionHandler: (data: NSData!,
response: NSURLResponse!,
error: NSError!) in
if error != nil
println("error=\(error)")
let alert = UIAlertView()
alert.delegate = self
alert.title = "Login Error"
alert.message = "\(error)"
alert.addButtonWithTitle("OK")
alert.show()
self.view.endEditing(true)
return
if let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
if response != nil
println("got profiles")
self.nextScreen()
self.dataVar = data // UPDATES VARIABLE TO SEND
).resume()
【问题讨论】:
How can I get the Data from NSURLSession.sharedSession().dataTaskWithRequest 的可能重复项 【参考方案1】:dataTaskWithRequest 的便捷方法本质上是返回数据或错误,通常带有一些响应头类型信息。如果您有错误,那么您将没有数据(99% 对此有把握)。我已重新格式化您的方法以提供帮助。 NSString Init Convenience 方法是同步的,所以不太清楚您所说的等待完成而不是 http 调用是什么意思?
func getStringFromRequest(completionHandler:(success:Bool, data: NSData?) -> Void)
let request = NSMutableURLRequest(URL: NSURL(string: "http://##.##.##.##/EPG/XML/QueryProfile")!)
request.HTTPMethod = "POST"
let postString = "<QueryProfileReq><type>1</type></QueryProfileReq>"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) (data, response, error) -> Void in
if let unwrappedError = error
print("error=\(unwrappedError)")
else
if let unwrappedData = data
completionHandler(success: true, data: unwrappedData)
return
completionHandler(success: false, data: nil)
task?.resume()
func performPost()
getStringFromRequest (success, data) -> Void in
if (success)
if let unwrappedData = data
self.dataVar = unwrappedData
if let responseString = NSString(data: unwrappedData, encoding: NSUTF8StringEncoding)
self.nextScreen()
else
print("Failed")
【讨论】:
我需要获取完整的响应字符串。然后我将数据复制到 NSData 变量。完成后,我需要转到屏幕并复制数据。这一切都需要按照这个顺序。大多数时候它都有效。但我需要确保按此顺序完成。 1. 完全收到响应字符串 2. 数据复制到变量 3. 转到新屏幕 嗨,我已经编辑了答案以建议如何处理这个 谢谢。虽然它不会带来任何错误。该应用程序现在只是挂在这部分。我已经放了一些 println 来看看什么在运行,什么没有。它开始 if let unwrappedData = data completionHandler(success: true, data: unwrappedData) 并在之后打印。但它不会更进一步。我也不确定现在在哪里调用 performPost?虽然我可能遗漏了一些明显的东西 你只需要调用performPost()。数据获取将成功与否,然后您可以决定如果成功该怎么办。我的意思只是为了演示一种方法,您可以将代码拆分为功能块,以便清楚起见并展示 completionHandler 的工作方式。 太好了,谢谢。我认为我的代码可以正常工作(尽管不如你的),但是五分之一的服务器必须退出。我只是要为此做一些事情。感谢您的帮助!以上是关于NSURLSession 响应字符串完成块 - Swift的主要内容,如果未能解决你的问题,请参考以下文章
如何在移动到下一行代码之前完成 NSURLSession 请求