嗯,我是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