Swift 插入子视图,以“a”;“长”;时间

Swift 插入子视图,以“a”;“长”;时间,swift,view,uiviewcontroller,Swift,View,Uiviewcontroller,在my container controller中,用户可以平移视图以切换到不同的视图。当平移手势开始时,将新视图控制器的视图添加到具有以下内容的视图中:view.insertSubView(view:,atIndex:) 在研究了一下之后,我注意到这个步骤大约需要0.03秒(而其他的都是0.001-0.002秒)。这会导致转换变得有点烦人 视图控制器在应用程序开始时使用情节提要创建为全局视图 此外,这仅在第一次加载视图时发生。之后的过渡都很流畅 我可以做些什么来预加载视图,这样在第一次加载视图

在my container controller中,用户可以平移视图以切换到不同的视图。当平移手势开始时,将新视图控制器的视图添加到具有以下内容的视图中:
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)
        }
    }
}
因为它只在第一次加载视图时发生,我想问题可能出在
viewdiload
viewwillbeen
的某个地方。结果如下所示。只有
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

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

使用工具找出代码运行缓慢的地方,而不是用时间戳记录语句。这将向您显示(包括系统调用)时间的确切位置

由于布局的原因,插入子视图可能会比较慢。但是,您的跟踪(比如它)表明创建和加载视图控制器的视图所花费的时间。你说这个观点来自故事板。里面有什么?加载此视图时会触发多少其他事件?使用时间探查器,您将能够判断。它可以是一个简单的属性,你给它一个默认值,它可以是一个惰性值

视图控制器在应用程序开始时使用情节提要创建为全局视图

如果是这种情况,则可以通过执行以下操作强制加载视图控制器的视图

let hack = viewcontroller.view

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

能否显示周围的上下文(插入发生的位置)?谢谢,这非常有用。从time profiler的结果中,我可以看到在这30毫秒中发生了什么:17毫秒用于加载故事板元素(表视图、搜索栏和约束),8毫秒用于“viewDidLoad”,另外5毫秒用于插入视图并添加到子视图控制器。似乎我不能改变太多来降低30毫秒,所以我想知道是否有办法在其他地方预加载所有这些?更新。这不是一个我非常自豪的解决方案,但它确实有效谢谢,似乎我也无法预加载它,除非我更改一半的代码。我想我将以编程方式创建视图控制器,以减少加载时间。我希望这能解决问题。从代码加载通常不会比从故事板加载快太多。你可以尝试在手势发生之前添加视图,只要用户需要时就可以显示它。索引只是一个例子,如果我更改了它,我想这无助于缩短加载时间。谢谢。我明白了,但请试试看。我想,在“已获取”索引处插入视图可能会导致冗余的布局和渲染操作。至少不会变得更糟,所以试试吧:)谢谢,我已经在顶部试过了,实际上其他的都试过了;不幸的是,这没有帮助。