2015-06-13 2 views
11

В главном представлении моего приложения у меня есть представление в виде таблицы и две ячейки прототипа. Я настроил segues для каждой ячейки, используя раскадровку. В контроллере представления я переопределяю prepareForSegue для передачи информации о выбранной ячейке в вид назначения.iOS segue заморозить в течение многих секунд, прежде чем показывать новый вид

Вид назначения не является особо сложным и, конечно же, не требует тяжелой обработки для загрузки.

ПРОБЛЕМА

Когда я нажмите на ячейку в главном контроллере для самого первого раза, вид назначения появляется после длительной задержки, от 5 до 40 секунд.

EDIT # 2: последующие краны, как правило, быстрее

Обратите внимание, что:

  • Если я нажимаю на той же клетке снова перед тем появился вид назначения, это вызывает вид назначения немедленно появиться.
  • Как и выше, но нажатие на другую ячейку приводит к тому, что представление появляется сразу же, но с данными из первой ячейки.
  • Как указано выше, но нажатие на другой элемент управления (без соответствующих сегментов) вызывает немедленное отображение вида назначения.
  • Последующие «краны» обычно проявляют меньшую задержку.
  • Time Profiler - для того, что я вижу - показывает, что абсолютно ничего не происходит в течение тех многих секунд задержки.
  • Я попробовал другой тип перетекает, но это не имеет никакого значения
  • показывает несколько Println, что следующая последовательность событий:

    • в главном окне, prepareForSegue выполняется (без задержек) не
    • того viewDidLoad назначения выполняется (без задержки)
    • ... Длительная задержка ...
    • мнения сбора и таблиц в дезе tination controller запускает методы, связанные с источником данных, для извлечения данных из контроллера. наконец, появляется
    • вида (с нежелательной анимацией, кстати, но это другая проблема)

Из того, что я читал на эту тему, я подозреваю, что проблема потенциально связана с некоторыми из выше операций, происходящих в фоновом потоке.

Любая идея, что я могу делать неправильно?

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") 
} 

EDIT # 3 я сделал образец проекта доступны на BitBucket

+1

Я думаю, что это ошибка. Раньше я это случалось со мной, и каждый раз, когда я делал сегу в первый раз. Началось с iOS 8. –

+0

Вы пытались запустить приложение в режиме выпуска? Я предполагаю, что вы увидите это поведение только в режиме отладки. –

+0

К сожалению, это также происходит в режиме выпуска. –

ответ

10

Я проверил ваш проект. И хотя я также не мог найти ничего другого, я также подозреваю, что это проблема с потоками.

мне удалось решить эту проблему путем реализации делегата для 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 

     } 
    }) 

} 

Обратите внимание, у вас установлен на вид контроллера раскадровки ID: BuilderToysListViewController, а также установить Tableview делегата , Не забудьте удалить сегменты.

В конце концов dissmis мнение в новом использовании контроллера представления этот код:

@IBAction func backButton(sender: AnyObject) 
{ 
    dismissViewControllerAnimated(true, completion: {() -> Void in 

    }) 
//  performSegueWithIdentifier("segueToysByBuilder", sender: nil)   

} 

Это позволит вам правильно закрыть окно вместо неправильно создавать новую.

+0

Спасибо @pteofil. Кажется, я ударил ошибку iOS 8. https://forums.developer.apple.com/message/12349 –

+0

Может ли кто-нибудь объяснить, что делает вышеуказанный код? У меня такая же проблема, когда некоторые отводы откладываются, а другие - обычные. Я не признаю botsRepository или код отправки, и я не хочу интегрировать код в свое приложение, не понимая его. Тем не менее, я действительно хочу приложение, которое не вызывает разочарования! Может кто-нибудь объяснить, что делает этот код/​​почему он помогает? Спасибо! @pteofil –

+0

Приведенный выше код просто представляет новый контроллер в коде, когда ячейка прослушивается, а не просто устанавливает вещи в раскадровке. В вашем случае вы можете пропустить часть, которая устанавливает botsRepository и строитель.Это просто свойства соответствующего контроллера. Однако 'dispatch_async' необходим, чтобы вызвать некоторый код для определенного потока. Все изменения в пользовательском интерфейсе должны быть сделаны в основном потоке. И обычно это происходит с вещами, созданными в раскадровке. Но есть ошибки, и в этом случае я сам представляю новый контроллер на основной поток для безопасности. – pteofil

0

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

Одна из распространенных причин длительных задержек в изменении пользовательского интерфейса (или изменение пользовательского интерфейса никогда не происходит) пытается сделать изменения пользовательского интерфейса из фонового потока. Возможно ли, что ваш код, вызывающий segue, работает в другом потоке? Вы можете легко это сказать, установив точку останова на этом коде и наблюдая номер потока при его разрыве. Если номер потока равен 0, вы работаете в основном потоке. Если это какой-то другой номер потока, это ваша проблема.

+0

Кроме того, я понял, что последующие «краны» ** обычно ** без задержки, но я только что видел случаи последовательных задержек в последующих. –

Смежные вопросы