Задержка при использовании метода 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 который я не смог найти ничего, что могло бы помочь мне в этом.

К сожалению, единственное, что сработало, - это либо использовать отдельную раскадровку для этого контроллера представления и создать ее оттуда, либо программно выполнить повторный просмотр контроллера представления.