【问题标题】:Delay when using instantiateViewControllerWithIdentifier but not performSegueWithIdentifier?使用 instantiateViewControllerWithIdentifier 但不 performSegueWithIdentifier 时延迟?
【发布时间】:2016-08-12 05:46:38
【问题描述】:

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

当使用instantiateViewControllerWithIdentifier 时,segue 第一次明显迟缓(约 3 秒),但随后每次都发生得相当快。其他 SO 帖子建议确保 segue 发生在代码完成的主线程上,但这并没有解决问题。

但是,使用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)
    }   
}

【问题讨论】:

  • 目标视图控制器的 viewDidLoad 和 viewWillAppear 方法到底发生了什么?
  • @arturdev 没有覆盖 viewWillAppear。在 viewDidLoad 中只有代理设置和隐藏/显示 UI 元素,更重要的是代码每次都是相同的(即第一次和随后的显示之间没有区别)。有什么建议吗?
  • 那里有网络请求吗?或任何[UIImage imageNamed:] 电话?
  • @arturdev 没有网络调用,也没有 UIImage 调用。感谢您的帮助!
  • 然后尝试从该按钮中删除所有操作,然后重新连接。我知道这很奇怪,但有时它对我有用:)

标签: ios swift uiviewcontroller uinavigationcontroller storyboard


【解决方案1】:

经过时间分析后,我意识到这是对instantiateViewController 的调用,我找不到任何可以帮助我的东西。

不幸的是,唯一可行的方法是为该视图控制器使用单独的故事板并从那里实例化它,或者以编程方式重做视图控制器。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      此问题可能在许多不同的情况下发生。确定导致您的特定问题的最佳方法是使用 Xcode 中包含的工具进行分析。

      1. 在您的 xcode 窗口中单击并按住 构建按钮。您将看到四个选项出现,选择Profile
      2. 构建运行后,将弹出一个带有仪器的窗口。从选项中选择时间分析
      3. 将出现一个新窗口,其中包含各种指标。左上角会有一个红色记录按钮。点击红色录制按钮,这将在您的手机上启动应用程序。
      4. 继续过渡给您带来的问题。转换发生后,通过选择开始录制时使用的相同按钮结束录制。
      5. 查看左下角的“详细信息” 窗格。您将看到标题为“运行时间”的列,它显示了执行代码中每个方法(操作系统方法和用户生成的代码)所花费的时间
      6. 确定是否有任何不合适的地方或意外发生。可能返回并再次执行过渡以比较两者之间的差异。单击列表中的函数将直接转到正在执行的代码。这会很有帮助。

      如果转换需要 3 到 5 秒,则很可能在执行这些步骤时,某个特定功能会很明显。快乐的分析!

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

      【讨论】:

      • 好主意,感谢您的详细说明!刚刚投了赞成票,所以现在你的 SO 代表几乎翻了一番。 :)
      • 谢谢!如果您认为这是最好的答案,请对其进行注释,让其他人知道它对您有用:)
      • 不幸的是,它对这个问题没有太大帮助,但它肯定会在未来有所帮助。仍然不知道问题出在哪里,因为分析器没有突出代码中的任何明显问题。如果您能提供帮助,请使用更多详细信息更新问题。
      • 您知道如何配置分析器以显示在特定视图控制器中花费了多少时间吗?
      猜你喜欢
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多