嗯,我是Swift的新手,我不太了解完成处理程序。我想从API获取请求并解析JSON响应,以便我可以获取令牌。但是我的代码发生了什么事情:每当我调用getAuthentication
函数时,我的UI冻结并等待数据获取。这里是getAuthentication
的代码异步API请求的同步API请求Swift 2.2
func getAuthentication(username: String, password: String){
let semaphore = dispatch_semaphore_create(0);
let baseURL = "Some URL here"
let url = NSURL(string: baseURL)!
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.HTTPBody = "{\n \"username\": \"\(username)\",\n \"password\": \"\(password)\"\n}".dataUsingEncoding(NSUTF8StringEncoding);
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
if error == nil{
let swiftyJSON = JSON(data: data!)
print(swiftyJSON)
//parse the data to get the user
self.id = swiftyJSON["id"].intValue
self.token = swiftyJSON["meta"]["token"].stringValue
} else {
print("There was an error")
}
dispatch_semaphore_signal(semaphore);
}
task.resume()
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
然后,我在我的LoginViewController中调用这个方法。有人说我正在使用Synchronous请求,这就是为什么我的UI冻结,但我真的不知道如何将其更改为Async并等待数据下载。有人可以帮我弄这个吗?任何帮助将不胜感激。
结帐[Alamofire](https://github.com/Alamofire/Alamofire)。这是执行异步HTTP请求的方便框架。 –
简单地摆脱信号量;你正在阻止主线程。你需要在完成关闭时处理响应 – Paulw11
@Reginald,这里使用的'NSURLSession'的'dataTaskWithRequest'函数是一个异步函数。这里不需要使用'dispatch_queue'。你可以检查我的答案。随时对任何疑问发表评论 – KrishnaCA