I am presenting a view controller:
SCAAboutController2 *controller = [[SCAAboutController2 alloc] initWithNibName:nil bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self presentViewController:navController animated:YES completion:nil];
The device hangs for 3-4 seconds before presenting. I have attempted to diagnose this using Instruments, but it seems most of the time is spent in main
-
Here is the same profile but with System Libraries unhidden:
None of these messages are recognizable to me, so I'm not sure how to start debugging my performance issue.
I read elsewhere that I should check that the main code is executing on the main thread. However, the following change is not improving anything:
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];
});
I've quickly run out of ideas on how to progress. How might I investigate further, and/or what might be the root cause of the slow presentation?
Edit
Some confusing discoveries:
- I've removed all code from the presented view controller. The performance is unaffected.
- I have another controller which I present from the same place via a different button. It is equally slow.
- the presentinging controller has quite a lot of subviews and constraints - even some child view controllers. Removing the code that populates these resolves the issue.
- nothing is added in the
viewWillDisappear
of the presenting controller.
Edit 2
I have discovered that the issues centers around a series of layout constraints I add in the main (presenting) controller. Specifically, I loop through some child controllers (of type teamController
) and add the constraint:
[self.browser addConstraint:[NSLayoutConstraint constraintWithItem:teamController.view
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.browser
attribute:NSLayoutAttributeWidth
multiplier:1
constant:0]];
There are only 10 child controllers. Also strange: I have no such issues if I use the following instead:
[self.browser.contentView addConstraint:[NSLayoutConstraint constraintWithItem:teamController.view
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:200]];
I am still very confused as to why these constraints would cause the presentation of another modal to hang, and why one variation of the constraint behaves drastically differently to the other.