Swift viewDidLoad 和 viewWillAppear 之间的长时间延迟
Swift Long Delay Between viewDidLoad and 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
开始之间有 3 秒的延迟。我不明白为什么会这样。我在 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)
创建和呈现视图控制器应该在主线程上完成。
(当视图更新延迟时,几乎总是意味着您错误地处理了后台线程。)
我把它放在那里是为了让人们理解 viewDidLoad
和 viewDidAppear
时间延迟,如果你在 UITableViewController
didSelectRowAt
中,你没有做错什么。
Swifts UITableViewController
didSelectRowAt
回调中显然存在隐藏的 async
await
后台线程错误:
如果您的代码看起来像这样,它可能会在 viewDidLoad
和 viewDidAppear
之间滞后 2 或 3 秒
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)
}
}
}
}
我遇到了一个问题,我在尝试展示 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
开始之间有 3 秒的延迟。我不明白为什么会这样。我在 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)
创建和呈现视图控制器应该在主线程上完成。
(当视图更新延迟时,几乎总是意味着您错误地处理了后台线程。)
我把它放在那里是为了让人们理解 viewDidLoad
和 viewDidAppear
时间延迟,如果你在 UITableViewController
didSelectRowAt
中,你没有做错什么。
Swifts UITableViewController
didSelectRowAt
回调中显然存在隐藏的 async
await
后台线程错误:
如果您的代码看起来像这样,它可能会在 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)
}
}
}
}