延迟使用instantiateViewControllerWithIdentifier但不执行SegueWithIdentifier?

下面的代码用于将另一个视图控制器推到导航堆栈上。

当使用instantiateViewControllerWithIdentifier ,segue在第一次(〜3秒)明显缓慢,但是在随后的每一次都会相当快地发生。 其他SOpostbuild议确保代码完成的主线程上发生,但这并没有解决问题。

但是,使用performSegueWithIdentifier不会造成延迟。

SendViewControllerviewDidLoad代码对于第一次和后续的推送是相同的。

尝试删除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中的工具进行分析。

  1. 点击并按住您的xcode窗口中的生成button 。 您将看到四个选项出现,selectconfiguration文件
  2. 一旦构build运行一个窗口,仪器将popup。 从选项中select时间分析
  3. 一个新的窗口将出现在其中的各种指标。 左上angular将有一个红色的loggingbutton 。 点击红色的loggingbutton,这将启动您的手机上的应用程序。
  4. 继续过渡给你的问题。 转换发生后,通过select与开始录制相同的button结束录制。
  5. 查看左下angular的“详细信息”窗格。 您将看到一个标题为“运行时间”的列,显示执行代码中每个方法所用的时间(OS方法和用户生成的代码)
  6. 确定是否有任何不合适的地方出现,或不是有意的。 可能返回并再次执行转换以比较两者之间的差异。 点击列表中的function将直接转到正在执行的代码。 这可以是非常有帮助的。

如果一个转换需要3-5秒钟,那么在执行这些步骤时,一个特定的function就很明显。 快乐的分析!

去年的WWDC在这方面也有很大的优势。 Def值得在这里查看:(仅在Safari中打开) WWDC Profiling Talk

问题被隔离到目标视图控制器中的UITextField的存在,也就是说,删除UITextField删除滞后。

然后进一步隔离到自定义字体的存在。

换句话说,使用UITextField上的系统字体,而不是自定义字体,可以消除滞后。 没有解释为什么,但它的工作原理。