В главном представлении моего приложения у меня есть представление таблицы и две ячейки прототипа. Я настроил segues для каждой ячейки, используя раскадровку. В контроллере представления я переопределяю prepareForSegue для передачи информации о выбранной ячейке в вид назначения.
Представление назначения не является особенно сложным и, конечно, не требует загрузки какой-либо тяжелой обработки.
ПРОБЛЕМА
Когда я нажимаю на ячейку основного контроллера в первый раз, вид назначения появляется после длительной задержки от 5 до 40 секунд.
EDIT # 2: последующие ответвления, как правило, быстрее
Обратите внимание, что:
- Если я снова коснусь одной и той же ячейки перед представлением адресата, это приведет к немедленному появлению представления назначения.
- Как и выше, но нажатие на другую ячейку приводит к тому, что представление появляется сразу же, но с данными из первой ячейки.
- Как указано выше, но нажатие на другой элемент управления (без связанных сегментов) вызывает немедленное отображение целевого представления.
- Последующие "краны" обычно проявляют меньшую задержку.
- Time Profiler - то, что я вижу - показывает, что абсолютно ничего не происходит в течение многих секунд задержки.
- Я пробовал разные типы segues, но это не имело значения.
-
Несколько println показывают, что происходит следующая последовательность событий:
- в главном представлении выполняется prepareForSegue (без задержек)
- тогда выполняется запуск viewDidLoad (без задержек)
- ... длительная задержка...
- представления коллекции и таблицы в контроллере назначения начинают вызывать методы, связанные с источником данных, для извлечения данных с контроллера.
- наконец появляется представление (с нежелательной анимацией, BTW, но это другая проблема).
Из того, что я прочитал по этой теме, я подозреваю, что проблема потенциально связана с некоторыми из вышеперечисленных операций, происходящих в фоновом потоке.
Любая идея, что я могу делать неправильно?
EDIT # 1: добавлен код
В главном контроллере просмотра сегменты были связаны с помощью панели рассказов (CTRL-перетащите две ячейки прототипа в вид назначения).
Код выглядит примерно так:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
var assetIndex = assetsTable.indexPathForSelectedRow()?.row
println("prepare for segue - start: \(assets[assetIds[assetIndex!]]!.Name)")
if let destination = segue.destinationViewController as? AssetThingsListViewController
{
destination.bundlesRepository = bundlesRepository!
destination.asset = assets[assetIds[assetIndex!]]
}
println("prepare for segue - end")
}
РЕДАКТИРОВАТЬ № 3 Я сделал образец проекта на BitBucket