Swift Long Delay Между viewDidLoad и viewWillAppear

Я столкнулся с проблемой, когда у меня была большая задержка при попытке представить ViewController, Я пытаюсь отобразить предупреждение об обновлении, когда пользователь нажимает на UITableViewCell который требует премиум доступа. в ViewController будучи представлен, я положил код отладки:

override func viewDidLoad() {
    super.viewDidLoad()

    println("\(NSDate()) viewDidLoad")
    // Set Navigation Title font and color
    self.navigationController?.navigationBar.titleTextAttributes = [NSFontAttributeName: UIFont(name: "UbuntuCondensed-Regular", size: 22)!,
        NSForegroundColorAttributeName: UIColor.whiteColor()]
    println("\(NSDate()) end of viewDidLoad")
}

override func viewWillAppear(animated: Bool) {
    println("\(NSDate()) before super.viewWillAppear(animated)")
    super.viewWillAppear(animated)
    println("\(NSDate()) after super.viewWillAppear(animated)")
}

override func viewDidAppear(animated: Bool) {
    println("\(NSDate()) before super.viewDidAppear(animated)")
    super.viewDidAppear(animated)

    println("\(NSDate()) after super.viewDidAppear(animated)")
}

println заявление привело к:

2015-06-23 16:36:54 +0000 viewDidLoad
2015-06-23 16:36:54 +0000 end of viewDidLoad
2015-06-23 16:36:57 +0000 before super.viewWillAppear(animated)
2015-06-23 16:36:57 +0000 after super.viewWillAppear(animated)
2015-06-23 16:36:58 +0000 before super.viewDidAppear(animated)
2015-06-23 16:36:58 +0000 after super.viewDidAppear(animated)

Как вы видите, между окончанием viewDidLoad и начало viewWillAppear, Я не могу понять, почему это происходит. Я создаю представления программно в рамках ViewControllerпоэтому раскадровка здесь не используется.

Это код, который я должен представить ViewController:

// Create the upgrade view contorller
let upgradeVC = UpgradeViewController()
// Set the presentation context
self.providesPresentationContextTransitionStyle = true
self.definesPresentationContext = true
// Set the upgrade controller to be modal over current context
upgradeVC.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
// Show the view controller
self.navigationController?.presentViewController(upgradeVC, animated: true, completion: nil)

1 ответ

Решение

Создание и представление контроллера представления должно быть сделано в главном потоке.

(Когда обновления просмотра задерживаются, это почти всегда означает, что вы ошибочно работаете в фоновом потоке.)

Я ставлю это там, чтобы люди понимали viewDidLoad а также viewDidAppear задержка - это ничего, что вы сделали неправильно, если вы находитесь в UITableViewControllerdidSelectRowAt,

Там явно скрыто asyncawait ошибка фонового потока внутри Swifts UITableViewControllerdidSelectRowAt Перезвоните:

Если ваш код выглядит примерно так, он может отставать на 2 или 3 секунды между viewDidLoad а также viewDidAppear

class ViewControllerList: UITableViewController{
   override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)       
   {
        let storyBoard = UIStoryboard(name: "Display", bundle:nil)
        let displayView = storyBoard.instantiateViewController(withIdentifier: "ViewControllerDisplay") as! ViewControllerDisplay
        self.present(displayView, animated: true, completion: nil)
   }
}

(несмотря на то, что ты ничего не делаешь, чтобы заслужить это)

это то, как вы ускоряете это в Swift 4

class ViewControllerList: UITableViewController{
   override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)       
   {
        DispatchQueue.global(qos: .background).async {
            // Background Thread
            DispatchQueue.main.async {
                // Run UI Updates or call completion block
                let storyBoard = UIStoryboard(name: "Display", bundle:nil)
                let displayView = storyBoard.instantiateViewController(withIdentifier: "ViewControllerDisplay") as! ViewControllerDisplay
                self.present(displayView, animated: true, completion: nil)
            }
        }
   }
}
Другие вопросы по тегам