Изпращам някои данни до сървъра си и при отговор отхвърлям своя контролер за изглед. В viewWillDisappear() на viewController се опитвам да отхвърля клавиатурата.
Ако presentER viewController не е основният изглед контролер, получавам изключението „[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] може да се извиква само от основната нишка.'“. Опитах се да извикам функция, която отхвърли клавиатурата, след това viewcontroller (премахвайки необходимостта от viewwilldisappear()), но има същия проблем.
Код: //в рамките на представения контролер за изглед
override func viewWillDisappear(animated: Bool)
{
super.viewWillDisappear(animated)
self.view.endEditing(true)
}
Код: //в рамките на presentER viewcontroller
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)
}
}