Swift:DismissViewController() 和关闭键盘的线程问题

Swift: Threading Issue With DismissViewController() and Dismissing Keyboard

我将一些数据发送到我的服务器,收到响应后,我关闭了我的视图控制器。在 viewController 的 viewWillDisappear() 中,我尝试关闭键盘。

如果 presentER viewController 不是根视图控制器,我会收到异常“[UIKeyboardTaskQueue waitUntilAllTask​​sAreFinished] 只能从主线程调用。”。我试图调用一个关闭键盘的函数,然后调用 viewcontroller(消除对 viewwilldisappear() 的需要)但它有同样的问题。

代码: //在呈现的范围内viewcontroller

override func viewWillDisappear(animated: Bool)
    {
            super.viewWillDisappear(animated)
            self.view.endEditing(true)
    }

代码: //在演示者中 viewcontroller

func manage_response(//)
    {
            run_on_background_thread
            {
                    self.parse(//)
                    run_on_main_thread
                    {
                          self.presented_controller.dismissViewControllerAnimated(true, completion: nil)

                    }
            }
    }

我所看到的一切都表明这是处理这种情况的方法。只有当我显示键盘并试图用它各自的 viewcontroller.

关闭它时,问题才会存在

编辑:

我用于线程化的尾部方法函数的语法:

func run_on_background_thread(code: () -> Void)
{
           dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), code)
}

func run_on_main_thread(code: () -> Void)
{
        dispatch_async(dispatch_get_main_queue(), code)
}

解决方案:

我已经找到问题所在。这个案例与之前的想法不同。当我尝试显示 UIAlertController(通过 presentViewController)时会发生这种情况,因为查询没有 return 正确的数据/凭据。

run_on_main_thread
            {
                    if let controller = visibleViewController() //recursive
                    {
                            controller.view.endEditing(true)
                            controller.presentViewController(alert, animated: true, completion: nil)
                    }
            }

您应该尝试以这种方式在主队列中关闭它:

dispatch_async(dispatch_get_main_queue()) { self.presented_controller.dismissViewControllerAnimated(true, completion: nil) }

您的总体思路是正确的,但是您发布的是伪代码。细节决定成败。如果您收到该错误消息,那么您的代码在某个地方从后台线程进行 UIKit 调用。

NSThread 有一个 class 方法 isMainThread()。您可以使用它来检查后台正在执行的代码 运行。

问题是显示 UIAlertViewController。 logic/code 将解决这样的问题:

run_on_main_thread
{
    if let controller = visibleViewController() //recursive
    {
         controller.view.endEditing(true)       
         controller.presentViewController(alert, animated: true, completion: nil)
    }
}