Задержка при использовании метода instantiateViewControllerWithIdentifier, но не выполнение функции SigueWithIdentifier?
Используемый ниже код используется для вставки другого контроллера вида в стек навигации.
При использовании instantiateViewControllerWithIdentifier
, segue заметно вяло в первый раз (~ 3 секунды), но происходит достаточно быстро каждый последующий раз. Другие сообщения SO, предлагающие обеспечить segue, происходят в основном потоке, который выполняет код, но это не устранило проблему.
Однако использование performSegueWithIdentifier
не приводит к задержке.
Код viewDidLoad
для SendViewController
одинаковый для первого и последующих нажатий.
Пробовал гашение viewDidLoad
для контроллера представления назначения, но все еще существует отставание для instantiateViewControllerWithIdentifier
, но не для performSegueWithIdentifier
.
Как исправить задержку с помощью instantiateViewControllerWithIdentifier
?
Без задержки:
@IBAction func buttonTapped(sender: UIButton) {
performSegueWithIdentifier(SendSegue, sender: self)
}
Результаты в задержке при первом просмотре SendViewController:
@IBAction func buttonTapped(sender: UIButton) {
dispatch_async(dispatch_get_main_queue()) {
let vc = self.storyboard!.instantiateViewControllerWithIdentifier(self.SendViewControllerID) as! SendViewController
self.navigationController!.pushViewController(vc, animated: true)
}
}
Ответы
Ответ 1
Проблема была изолирована от наличия UITextField в контроллере представления назначения, то есть удаление UITextField удаляет задержку.
Затем он был дополнительно изолирован от наличия пользовательского шрифта.
Другими словами, использование системного шрифта на UITextField, а не пользовательский шрифт, устраняет задержку. Никаких объяснений, но это работает.
Ответ 2
Эта проблема может возникать во многих разных сценариях. Лучший способ определить, что вызывает вашу конкретную проблему, - это профилирование с помощью инструментов, включенных в Xcode.
- Нажмите и удерживайте кнопку Создать в окне xcode. Появятся четыре параметра, выберите Профиль.
- После создания сборки появится окно с инструментами. Выберите, Профилирование времени из параметров.
- В нем появится новое окно с различными метриками. В верхнем левом углу будет кнопка красная запись. Нажмите красную кнопку записи, и это запустит приложение на вашем телефоне.
- Перейдите к переходу, дающему вам проблемы. Завершите запись после перехода, выбрав ту же кнопку, с которой вы начали запись.
- Просмотрите панель "Подробности" в левом нижнем углу. Вы увидите столбец под названием "Время выполнения", в котором указано время, затрачиваемое на выполнение каждого метода в вашем коде (оба метода ОС и код, сгенерированный пользователем).
- Определите, что-то не в порядке или происходит, что не предназначено. Возможно, вернитесь назад и выполните переход снова, чтобы сравнить разницу между ними. Щелчок по функции в списке приведет вас непосредственно к выполняемому коду. Это может быть очень полезно.
Весьма вероятно, что если переход займет 3-5 секунд, одна конкретная функция будет очевидна при выполнении этих шагов. Счастливое профилирование!
WWDC с прошлого года также имеет большой сегмент. Def worth проверить здесь: (только в Safari) Обсуждение профилей WWDC
Ответ 3
После профилирования времени я понял, что это был вызов instantiateViewController
который я не смог найти ничего, что могло бы помочь мне в этом.
К сожалению, единственное, что сработало, - это либо использовать отдельную раскадровку для этого контроллера представления и создать ее оттуда, либо программно выполнить повторный просмотр контроллера представления.