【发布时间】:2014-04-30 09:27:09
【问题描述】:
我正在展示一个视图控制器:
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];
});
我很快就没有关于如何进步的想法了。我该如何进一步调查,和/或演示缓慢的根本原因是什么?
编辑
一些令人困惑的发现:
- 我已经从显示的视图控制器中删除了所有代码。性能不受影响。
- 我有另一个控制器,我通过不同的按钮从同一个地方呈现。它同样慢。
- presentinging 控制器有很多子视图和约束 - 甚至是一些子视图控制器。删除填充这些的代码可以解决问题。
- 在呈现控制器的
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]];
我仍然很困惑为什么这些约束会导致 另一个 模态的显示挂起,以及为什么一个约束的变体与另一个变体的行为截然不同。
【问题讨论】:
-
UI 总是在主线程中执行
-
NSIS* 与自动布局引擎有关。在呈现的视图控制器中会发生什么?视图是如何布局的?有多少个子视图?
-
感谢您的提示 - 请参阅我的编辑。我有一些可以优化的布局代码,但它在当前ing 控制器中:/
-
@BenPackard 你有没有得到任何解决方案。如果是这样,请发布此问题的答案。
-
没有有效的解决方案。
标签: ios iphone performance cocoa-touch instruments