我正在呈现一个视图控制器:
SCAAboutController2 *controller = [[SCAAboutController2 alloc] initWithNibName:nil bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self presentViewController:navController animated:YES completion:nil];
设备在呈现之前会停顿3-4秒。我尝试使用Instruments诊断,但似乎大部分时间都花费在main
上。
这是相同的配置文件,但隐藏了系统库:
对我来说,这些消息都不可识别,所以我不知道如何开始调试性能问题。
我在其他地方读到应该检查主代码是否在主线程上执行。然而,以下更改并没有改善任何事情:
dispatch_async(dispatch_get_main_queue(), ^{
SCAAboutController2 *controller = [[SCAAboutController2 alloc] initWithNibName:nil bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self presentViewController:navController animated:YES completion:nil];
});
我已经很快地没有了如何进展的想法。我应该如何进一步调查,或者缓慢呈现的根本原因是什么?
编辑
一些令人困惑的发现:
- 我已经从呈现的视图控制器中删除了所有代码。性能没有受到影响。
- 我还有另一个控制器,通过不同的按钮从同一位置呈现。它同样很慢。
- 呈现ing控制器有很多子视图和约束,甚至有一些子视图控制器。删除填充这些内容的代码可以解决问题。
- 在呈现控制器的
viewWillDisappear
中没有添加任何内容。
编辑2
我发现问题集中在我在主(呈现)控制器中添加的一系列布局约束上。具体而言,我遍历一些子控制器(类型为teamController
),并添加约束:
[self.browser addConstraint:[NSLayoutConstraint constraintWithItem:teamController.view
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.browser
attribute:NSLayoutAttributeWidth
multiplier:1
constant:0]];
只有10个子控制器。同样奇怪的是,如果我使用以下代码就没有这个问题:
[self.browser.contentView addConstraint:[NSLayoutConstraint constraintWithItem:teamController.view
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:200]];
我仍然对为什么这些限制会导致展示另一个模态框停滞感到困惑,并且为什么其中一种限制的变体表现出截然不同的行为感到困惑。