UIKeyboardTaskQueue只能从主线程调用 [英] UIKeyboardTaskQueue may only be called from the main thread
问题描述
我在尝试创建一个自动创建POST请求,发送请求,获取响应并处理它们的功能时遇到问题,然后显示UIAlertView告诉用户这是什么问题.
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.
这是我的代码:
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();
错误代码如下:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] may only be called from the main thread.'
当我的请求返回错误的响应(#400,#50,#100)时,代码可以工作并显示UIAlertView,但是如果响应良好,它会给我上面的错误代码.
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.
推荐答案
您应该在主线程上调用UIAlertController,因为您正在处理ui.
You should call your UIAlertController on the main thread because you're dealing with the ui.
Swift 2.X
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
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)
{
}
}
这篇关于UIKeyboardTaskQueue只能从主线程调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!