关于ios:UIKeyboardTaskQueue只能从主线程调用

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
 })