Подтвердить что ты не робот

IOS segue заморозится в течение многих секунд, прежде чем показывать новый вид

В главном представлении моего приложения у меня есть представление таблицы и две ячейки прототипа. Я настроил 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

4b9b3361

Ответ 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, вы работаете в основном потоке. Если это какой-то другой номер потока, это ваша проблема.