Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIKeyboardTaskQueue may only be called from the main thread

I have a problem while trying to make a function that automatically create POST request, send them, get the response, and handle them then show UIAlertView to tell the user which problem it is.

Here is my code :

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(); 

The error code is the following :

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

When my request return a bad response (the #400, #50, #100), the code works and show the UIAlertView but if the response is good, it gives me the error code as above.

like image 801
Orionss Avatar asked Sep 18 '16 16:09

Orionss


2 Answers

You should call your UIAlertController on the main thread because you're dealing with the ui.

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)     {      } } 
like image 180
Ramon Vasconcelos Avatar answered Sep 20 '22 06:09

Ramon Vasconcelos


For swift 3.x and 4.x

DispatchQueue.main.async(execute: { // work Needs to be done  }) 
like image 35
gamal Avatar answered Sep 22 '22 06:09

gamal