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
задержка - это ничего, что вы сделали неправильно, если вы находитесь в UITableViewController
didSelectRowAt
,
Там явно скрыто async
await
ошибка фонового потока внутри Swifts UITableViewController
didSelectRowAt
Перезвоните:
Если ваш код выглядит примерно так, он может отставать на 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)
}
}
}
}