UIKeyboardTaskQueue may only be called from the main thread
我在尝试创建一个自动创建POST请求,发送请求,获取响应并处理它们的功能时遇到问题,然后显示UIAlertView告诉用户这是什么问题。
这是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | 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(); |
错误代码如下:
1 | Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] may only be called from the main thread.' |
当我的请求返回错误响应(#400,#50,#100)时,代码可以工作并显示UIAlertView,但如果响应良好,它会给我上述错误代码。
您应该在主线程上调用UIAlertController,因为您正在处理ui。
Swift 2.X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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) { } } |
迅捷4.2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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) { } } |
用于快速3.x和4.x
1 2 3 | DispatchQueue.main.async(execute: { // work Needs to be done }) |