最近新写了一个swift的app,写完后发现,应用启动时,显示完启动页后,出现了短暂的黑屏之后,才显示了根页面。
一、问题排查
一开始我以为是SceneDelegate导致的,于是我新建了一个项目,用空ViewController作为根页面,试验结果是不会出现黑屏情况,然后我到自己原项目进行一步步排查,最后发现原因在这里:
DispatchQueue.main.async {
let nav = UINavigationController(rootViewController: vc)
nav.setNavigationBarHidden(true, animated: false)
keyWindow.rootViewController = nav
}
keyWindow.makeKeyAndVisible()
问题就是这里的DispatchQueue.main.async,把这个去掉就不会出现黑屏了。
二、总结
DispatchQueue.main.async会导致 rootViewController 的替换,被延迟到下一次 RunLoop 执行,导致在应用启动的第一个时刻,UIWindow没有内容可以渲染,于是系统显示了一个默认的黑屏。
记录一下。