Swift:DismissViewController() 和关闭键盘的线程问题
Swift: Threading Issue With DismissViewController() and Dismissing Keyboard
我将一些数据发送到我的服务器,收到响应后,我关闭了我的视图控制器。在 viewController 的 viewWillDisappear() 中,我尝试关闭键盘。
如果 presentER viewController 不是根视图控制器,我会收到异常“[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] 只能从主线程调用。”。我试图调用一个关闭键盘的函数,然后调用 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)
}
}
我将一些数据发送到我的服务器,收到响应后,我关闭了我的视图控制器。在 viewController 的 viewWillDisappear() 中,我尝试关闭键盘。
如果 presentER viewController 不是根视图控制器,我会收到异常“[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] 只能从主线程调用。”。我试图调用一个关闭键盘的函数,然后调用 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)
}
}