Я отправляю некоторые данные на свой сервер, и после ответа я отключаю свой контроллер представления. В viewController viewWillDisappear() я пытаюсь отключить клавиатуру.
Если presentER viewController не является корневым контроллером представления, я получаю исключение «[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] может вызываться только из основного потока». Я попытался вызвать функцию, которая отключала клавиатуру, а затем контроллер представления (удаляя необходимость в viewwilldisappear()), но у нее та же проблема.
Код: // в представленном контроллере представления
override func viewWillDisappear(animated: Bool)
{
super.viewWillDisappear(animated)
self.view.endEditing(true)
}
Код: // внутри контроллера представления PresentER
func manage_response(//)
{
run_on_background_thread
{
self.parse(//)
run_on_main_thread
{
self.presented_controller.dismissViewControllerAnimated(true, completion: nil)
}
}
}
Все, что я видел, указывает на то, как справиться с ситуацией. Проблема существует только тогда, когда у меня отображается клавиатура, и я пытаюсь отключить ее с помощью соответствующего контроллера просмотра.
Редактировать:
Синтаксис для функций завершающего метода, которые я использую для потоковой передачи:
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), потому что запрос не вернул правильные данные/учетные данные.
run_on_main_thread
{
if let controller = visibleViewController() //recursive
{
controller.view.endEditing(true)
controller.presentViewController(alert, animated: true, completion: nil)
}
}