puede probar para mini llamar codigos codigo ios swift swift2.3

ios - probar - UIKeyboardTaskQueue solo se puede llamar desde el hilo principal



codigos para iphone 7 (2)

Debería llamar a su UIAlertController en el hilo principal porque está tratando con la interfaz de usuario.

Swift 2.X

dispatch_async(dispatch_get_main_queue(),{ var alert = UIAlertController(title: "Chargement", message: "Envoi des informations...", preferredStyle: UIAlertControllerStyle.Alert) viewController.presentViewController(alert, animated: true, completion: nil) answer = NSString(data: data!, encoding: NSUTF8StringEncoding)! print(answer) var complete = false alert.dismissViewControllerAnimated(true, completion: { () -> Void in complete = true }) while(!complete) { } }

Swift 4.2

DispatchQueue.main.async { var alert = UIAlertController(title: "Chargement", message: "Envoi des informations...", preferredStyle: UIAlertControllerStyle.Alert) viewController.presentViewController(alert, animated: true, completion: nil) let answer = String(data: data!, encoding: .utf8)! print(answer) var complete = false alert.dismissViewControllerAnimated(true, completion: { () -> Void in complete = true }) while(!complete) { } }

Tengo un problema al intentar realizar una función que crea automáticamente una solicitud POST, las envía, obtiene la respuesta y las maneja, luego muestra UIAlertView para decirle al usuario qué problema tiene.

Aquí está mi código:

let task = session.dataTaskWithRequest(request, completionHandler:{ (data, response, error) -> Void in dispatch_async(dispatch_get_main_queue(),{ var alert = UIAlertController(title: "Chargement", message: "Envoi des informations...", preferredStyle: UIAlertControllerStyle.Alert) viewController.presentViewController(alert, animated: true, completion: nil) answer = NSString(data: data!, encoding: NSUTF8StringEncoding)! print(answer) var complete = false alert.dismissViewControllerAnimated(true, completion: { () -> Void in complete = true }) while(!complete) { } var textmsg: String if(answer == "#400") { textmsg = "Il manque une information !" } else if(answer == "#50") { textmsg = "Le compte fourni ne correspond pas." } else if(answer == "#100") { textmsg = "Impossible d''identifier l''application." } else if(answer == "#1") { textmsg = "Transfert terminé avec succès !" } else { textmsg = "Echec du transfert." } let alertComplete = UIAlertController(title: "Chargement", message: textmsg, preferredStyle: UIAlertControllerStyle.Alert) alertComplete.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)) viewController.presentViewController(alertComplete, animated: true, completion: nil) }) }) task.resume();

El código de error es el siguiente:

Terminating app due to uncaught exception ''NSInternalInconsistencyException'', reason: ''-[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] may only be called from the main thread.''

Cuando mi solicitud devuelve una respuesta incorrecta (el # 400, # 50, # 100), el código funciona y muestra el UIAlertView pero si la respuesta es buena, me da el código de error como se muestra arriba.


Para swift 3.x

DispatchQueue.main.async(execute: { // work Needs to be done })