如何在 swift 中的异步内部函数中 return 外部函数?
How to return an outer function inside an asynchronous inner function in swift?
我正在创建一个 swift class,其中包含一个验证用户是否真实的函数。但是,userVerifyResult
将始终 return "false" 即使结果为真,因为 dataTaskWithRequest
函数是异步执行的。我该如何解决这个问题?
class userLibService: NSObject{
func VerifyUser() -> String{
var userVerifyResult = "false"
var url = NSURL(string: "http://www.example.com/test.php")!
var request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
var bodyData = "username=tee&password=123&data=true"
request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request){
data, response, error in
var parseError: NSError?
if let json = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &parseError) as? [String : String] {
if(json["valid"]! == "true"){
userVerifyResult = "true"
}else{
userVerifyResult = "false"
}
}
}
task.resume()
return userVerifyResult
}
}
在我的主程序中:
var test = userLibService()
println(test.VerifyUser())
它会 return "false" 即使用户名和密码是真的
在 return 函数之前无法阻止 NSURLSessionDataTask
(据我所知),因此不可能那样做。您必须在任务完成处理程序中有一个回调,它将打印结果或将打印委托给另一个函数
使用完成处理程序,就像 Apple 在其框架中所做的那样:
func verifyUser(completionHandler: ((result: Bool)->())) {
然后 return 结果通过
if(json["valid"]! == "true"){
completionHandler(result: true)
}else{
completionHandler(result: false)
}
然后将其调用为
verifyUser { (result) -> () in
println(result)
}
我正在创建一个 swift class,其中包含一个验证用户是否真实的函数。但是,userVerifyResult
将始终 return "false" 即使结果为真,因为 dataTaskWithRequest
函数是异步执行的。我该如何解决这个问题?
class userLibService: NSObject{
func VerifyUser() -> String{
var userVerifyResult = "false"
var url = NSURL(string: "http://www.example.com/test.php")!
var request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
var bodyData = "username=tee&password=123&data=true"
request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request){
data, response, error in
var parseError: NSError?
if let json = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &parseError) as? [String : String] {
if(json["valid"]! == "true"){
userVerifyResult = "true"
}else{
userVerifyResult = "false"
}
}
}
task.resume()
return userVerifyResult
}
}
在我的主程序中:
var test = userLibService()
println(test.VerifyUser())
它会 return "false" 即使用户名和密码是真的
在 return 函数之前无法阻止 NSURLSessionDataTask
(据我所知),因此不可能那样做。您必须在任务完成处理程序中有一个回调,它将打印结果或将打印委托给另一个函数
使用完成处理程序,就像 Apple 在其框架中所做的那样:
func verifyUser(completionHandler: ((result: Bool)->())) {
然后 return 结果通过
if(json["valid"]! == "true"){
completionHandler(result: true)
}else{
completionHandler(result: false)
}
然后将其调用为
verifyUser { (result) -> () in
println(result)
}