insertSubVIew花了很长时间

时间:2015-12-17 13:29:29

标签: swift view uiviewcontroller

在我的容器控制器中,用户可以平移视图以切换到不同的视图。当平移手势开始时,它会将新视图控制器的视图添加到视图中:view.insertSubView(view:, atIndex:)

经过一番研究,我注意到这个步骤大约需要0.03秒(而其他的都是0.001-0.002秒)。这导致过渡到一点点,这有点烦人。

视图控制器使用故事板在应用程序的开头创建为全局视图。

此外,这仅在第一次加载视图时发生。转换完全都是流利的。

我可以做些什么来预加载视图,以便在第一次加载时不会那么“长”?

修改
环境背景:

var pendingViewController: UIViewController! {
    didSet {
        if let pending = pendingViewController {

            addChildViewController(pending)

            let index = view.subviews.count - 1

            NSLog("start insert view test")
            view.insertSubview(pending.view, atIndex: index)
            NSLog("end insert view test")

            pending.didMoveToParentViewController(self)
        }
    }
}

因为它只是在第一次加载视图时才发生,我认为问题可能出现在viewDidLoadviewWillAppear的某个地方。结果如下所示。只有viewDidLoad花费了少量时间(0.005秒)。在到viewDidLoad之前有一个0.02秒的间隙,但我不知道它可能是什么。

2015-12-17 15:15:57.116 Valor[777:232799] start insertView view test
2015-12-17 15:15:57.136 Valor[777:232799] start viewDidLoad test
2015-12-17 15:15:57.141 Valor[777:232799] end   viewDidLoad test
2015-12-17 15:15:57.142 Valor[777:232799] start viewWillAppear test
2015-12-17 15:15:57.144 Valor[777:232799] end   viewWillAppear test
2015-12-17 15:15:57.146 Valor[777:232799] end   insertView view test

2 个答案:

答案 0 :(得分:2)

使用工具查找慢速代码发生的位置,而不是带有时间戳的日志语句。这将显示(包括系统调用)完全所花费的时间。

由于布局,插入子视图可能会很慢。但是,您的跟踪(例如它)表明创建和加载视图控制器视图所花费的时间。你说这个观点来自故事板。那里有什么?此视图加载时会触发多少其他内容?使用时间分析器,您将能够告诉。它可能是一个简单的属性,你提供一个默认值,而不是一个懒惰的值。

  

视图控制器使用故事板在应用程序的开头创建为全局视图。

如果是这种情况,那么您可以通过执行类似

之类的操作来强制加载视图控制器的视图
let hack = viewcontroller.view

访问视图控制器的view属性会导致它从故事板中加载视图。

答案 1 :(得分:0)

乍一看,我看到一个奇怪的事情:插入pending.view的索引。例如,如果视图上的视图计数为5,则表示其子视图的索引从0到4不等。然后,您希望将新子视图放在索引4(= 5 - 1),而其中一个已经打开您的视图哪个索引= 4.AFAICS,您的意思是5而不是4.因此,您应该坚持let index = view.subviews.count然后在该索引处插入新视图,或者只使用view.addSubview(pending.view)。我希望这会帮助你。