延迟使用instantiateViewControllerWithIdentifier但不执行SegueWithIdentifier?
下面的代码用于将另一个视图控制器推到导航堆栈上。
当使用instantiateViewControllerWithIdentifier
,segue在第一次(〜3秒)明显缓慢,但是在随后的每一次都会相当快地发生。 其他SOpostbuild议确保代码完成的主线程上发生,但这并没有解决问题。
但是,使用performSegueWithIdentifier
不会造成延迟。
SendViewController
的viewDidLoad
代码对于第一次和后续的推送是相同的。
尝试删除viewDidLoad
目标视图控制器,但仍存在instantiateViewControllerWithIdentifier
滞后,但不执行performSegueWithIdentifier
。
如何解决与instantiateViewControllerWithIdentifier
延迟?
没有延迟:
@IBAction func buttonTapped(sender: UIButton) { performSegueWithIdentifier(SendSegue, sender: self) }
第一次显示SendViewController时导致延迟:
@IBAction func buttonTapped(sender: UIButton) { dispatch_async(dispatch_get_main_queue()) { let vc = self.storyboard!.instantiateViewControllerWithIdentifier(self.SendViewControllerID) as! SendViewController self.navigationController!.pushViewController(vc, animated: true) } }
在许多不同的情况下可能会发生此问题。 确定是什么导致您的具体问题的最好方法是通过configuration包含在Xcode中的工具进行分析。
- 点击并按住您的xcode窗口中的生成button 。 您将看到四个选项出现,selectconfiguration文件 。
- 一旦构build运行一个窗口,仪器将popup。 从选项中select时间分析 。
- 一个新的窗口将出现在其中的各种指标。 左上angular将有一个红色的loggingbutton 。 点击红色的loggingbutton,这将启动您的手机上的应用程序。
- 继续过渡给你的问题。 转换发生后,通过select与开始录制相同的button结束录制。
- 查看左下angular的“详细信息”窗格。 您将看到一个标题为“运行时间”的列,显示执行代码中每个方法所用的时间(OS方法和用户生成的代码)
- 确定是否有任何不合适的地方出现,或不是有意的。 可能返回并再次执行转换以比较两者之间的差异。 点击列表中的function将直接转到正在执行的代码。 这可以是非常有帮助的。
如果一个转换需要3-5秒钟,那么在执行这些步骤时,一个特定的function就很明显。 快乐的分析!
去年的WWDC在这方面也有很大的优势。 Def值得在这里查看:(仅在Safari中打开) WWDC Profiling Talk
问题被隔离到目标视图控制器中的UITextField的存在,也就是说,删除UITextField删除滞后。
然后进一步隔离到自定义字体的存在。
换句话说,使用UITextField上的系统字体,而不是自定义字体,可以消除滞后。 没有解释为什么,但它的工作原理。