Nun, ich bin neu in Swift und ich weiß nicht viel von Abschluss-Handler. Ich möchte eine Anfrage von einer API erhalten und die JSON-Antwort analysieren, damit ich das Token bekommen kann. Aber was passiert mit meinem Code ist, dass, wenn ich die getAuthentication
Funktion meine Benutzeroberfläche einfriert und darauf warten, dass die Daten zu bekommen. Hier ist der Code für getAuthentication
Synchrone API-Anfrage an asynchrone API-Anfrage 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);
}
dann rufe ich diese Methode in meinem LoginViewController. Jemand sagt, dass ich eine synchrone Anfrage verwende, deshalb friert meine Benutzeroberfläche ein, aber ich habe wirklich keine Ahnung, wie ich sie in Async ändern und auf den Download der Daten warten kann. Kann mir jemand dabei helfen? Jede Hilfe wird sehr geschätzt werden.
Kasse [Alamofire] (https://github.com/Alamofire/Alamofire). Es ist ein praktisches Framework für asynchrone HTTP-Anfragen. –
Einfach den Semaphor loswerden; Sie blockieren damit den Haupt-Thread. Sie müssen die Antwort in der Abschlussverarbeitung verarbeiten – Paulw11
@Reginald, 'dataTaskWithRequest' Funktion von' NSURLSession' verwendet hier ist eine asynchrone Funktion. Keine Notwendigkeit, 'dispatch_queue' hier zu verwenden. Sie können meine Antwort überprüfen. Fühlen Sie sich frei, für irgendwelche Zweifel zu kommentieren – KrishnaCA