Swift:来自 NSURLSession 任务的 Return JSON 字符串
Swift: Return JSON string from NSURLSession task
我想获取字符串类型的令牌,但是以下代码 returns 错误为“ "String" 无法转换为 "Void" ”。
你能告诉我问题是什么吗?
为了解析JSON,我使用了SwiftyJSON
func authentication() -> String {
let request = NSMutableURLRequest(URL: NSURL(string: "https://~~~/v2/authenticate/api")!)
request.HTTPMethod = "POST"
var loginID = "my_ID"
var apiKey = "my_APIKEY"
var postString:NSString = "login_id=\(loginID)&api_key=\(apiKey)"
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)")
let json = JSON(data:data)
if let token = json["auth_token"].stringValue{
println("\(token)")
return token ///Error Here
}
}
task.resume()
}
※1月6日编辑7:50(GMP+9hr)
我进行了如下编辑,但出现“"Use of unresolved identifier "tokenString”错误。
请告诉我如何解决这个问题。
func authentication() -> String {
let request = NSMutableURLRequest(URL: NSURL(string: "https://~~~/v2/authenticate/api")!)
request.HTTPMethod = "POST"
var loginID = "my_ID"
var apiKey = "my_APIKEY"
var postString:NSString = "login_id=\(loginID)&api_key=\(apiKey)"
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)")
let json = JSON(data:data)
if let token = json["auth_token"].stringValue{
println("\(token)")
tokenString = self.didReceiveAuthToken(token)///Edited
}
}
task.resume()
return tokenString
}
func didReceiveAuthToken(token : String) ->String{
return token
}
dataTaskWithRequest
闭包采用 return 类型的 void
。 return 字符串的方法在 task.resume()
执行后立即结束,不会 return 任何东西。
您的基本问题是您将同步思维应用于异步任务。一个简单的建议是让 authentication()
return void(即什么都没有),然后创建一个单独的方法,如 didReceiveAuthToken(token : String)
,当收到令牌时由您的完成处理程序调用。
我想获取字符串类型的令牌,但是以下代码 returns 错误为“ "String" 无法转换为 "Void" ”。 你能告诉我问题是什么吗? 为了解析JSON,我使用了SwiftyJSON
func authentication() -> String {
let request = NSMutableURLRequest(URL: NSURL(string: "https://~~~/v2/authenticate/api")!)
request.HTTPMethod = "POST"
var loginID = "my_ID"
var apiKey = "my_APIKEY"
var postString:NSString = "login_id=\(loginID)&api_key=\(apiKey)"
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)")
let json = JSON(data:data)
if let token = json["auth_token"].stringValue{
println("\(token)")
return token ///Error Here
}
}
task.resume()
}
※1月6日编辑7:50(GMP+9hr) 我进行了如下编辑,但出现“"Use of unresolved identifier "tokenString”错误。 请告诉我如何解决这个问题。
func authentication() -> String {
let request = NSMutableURLRequest(URL: NSURL(string: "https://~~~/v2/authenticate/api")!)
request.HTTPMethod = "POST"
var loginID = "my_ID"
var apiKey = "my_APIKEY"
var postString:NSString = "login_id=\(loginID)&api_key=\(apiKey)"
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)")
let json = JSON(data:data)
if let token = json["auth_token"].stringValue{
println("\(token)")
tokenString = self.didReceiveAuthToken(token)///Edited
}
}
task.resume()
return tokenString
}
func didReceiveAuthToken(token : String) ->String{
return token
}
dataTaskWithRequest
闭包采用 return 类型的 void
。 return 字符串的方法在 task.resume()
执行后立即结束,不会 return 任何东西。
您的基本问题是您将同步思维应用于异步任务。一个简单的建议是让 authentication()
return void(即什么都没有),然后创建一个单独的方法,如 didReceiveAuthToken(token : String)
,当收到令牌时由您的完成处理程序调用。