IOS segue заморозится в течение многих секунд, прежде чем показывать новый вид
В главном представлении моего приложения у меня есть представление таблицы и две ячейки прототипа. Я настроил segues для каждой ячейки, используя раскадровку. В контроллере представления я переопределяю prepareForSegue для передачи информации о выбранной ячейке в вид назначения.
Представление назначения не является особенно сложным и, конечно, не требует загрузки какой-либо тяжелой обработки.
ПРОБЛЕМА
Когда я нажимаю на ячейку основного контроллера в первый раз, вид назначения появляется после длительной задержки от 5 до 40 секунд.
EDIT # 2: последующие ответвления, как правило, быстрее
Обратите внимание, что:
Из того, что я прочитал по этой теме, я подозреваю, что проблема потенциально связана с некоторыми из вышеперечисленных операций, происходящих в фоновом потоке.
Любая идея, что я могу делать неправильно?
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
Ответы
Ответ 1
Я проверил ваш проект. И хотя я также ничего не мог найти, я также подозреваю, что это проблема с потоками.
Мне удалось устранить проблему, выполнив делегат для tableview
и представив новый контроллер в коде:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let destination = storyboard?.instantiateViewControllerWithIdentifier("BuilderToysListViewController") as! BuilderToysListViewController
destination.botsRepository = botsRepository!
destination.builder = builders[builderIds[indexPath.row]]
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.presentViewController(destination, animated: true) { () -> Void in
}
})
}
Обратите внимание, что у вас установлен идентификатор раскадровки диспетчера представлений: BuilderToysListViewController
, а также установите делегат tableview. Не забудьте удалить сегменты.
В конце dismis вид в новом контроллере представления использует этот код:
@IBAction func backButton(sender: AnyObject)
{
dismissViewControllerAnimated(true, completion: { () -> Void in
})
// performSegueWithIdentifier("segueToysByBuilder", sender: nil)
}
Это позволит вам правильно закрыть представление вместо неправильного создания нового.
Ответ 2
Трудно сказать, если вы не разместите свой код, отвечающий на нажатие на ячейку и представляющий новый контроллер представления.
Одна из распространенных причин длительных задержек с изменениями пользовательского интерфейса (или изменения в пользовательском интерфейсе никогда не происходит) пытается сделать изменения пользовательского интерфейса из фонового потока. Возможно ли, что ваш код, вызывающий segue, работает в другом потоке? Вы можете легко это сказать, установив точку останова на этом коде и наблюдая номер потока при его разрыве. Если номер потока равен 0, вы работаете в основном потоке. Если это какой-то другой номер потока, это ваша проблема.