自从在iOS 8上测试我的应用程序以来,我发现一个关于视图控制器初始化和演示的工作真的很慢.
我以前在iOS 6& 7:
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
- ....
- [self.window setRootViewController:_rootController];
- [self.window makeKeyAndVisible];
- // Conditions
- if (#first launch condition#) {
- // quite small controller containing Welcome showcase
- WelcomeViewController *w = ....
- [_rootViewController presentViewController:w animated:NO];
- }
- else if (#last opened item condition#) {
- // pretty big container,root view controller contains
- // a grid view which opens Item detail container the same way
- ItemDetailController *item = ....
- [_rootViewController presentViewController:item animated:NO];
- }
- }
这成为一个非常迟钝的地狱与iOS 8.根视图控制器现在出现可见的0.5-1秒,然后立即重绘屏幕与呈现.此外,演示的缓慢开始导致不平衡调用开始/结束外观转换_rootViewController警告.
初始的快速提示是通过调用另一个函数来移动这两个条件,并使用零延迟调用它,以便在下一个主运行循环中进行处理:
- [self performSelector:@selector(postAppFinishedPresentation) withObject:nil afterDelay:0];
或类似的东西.这解决了不平衡的调用问题,但是视觉差距(rootviewcontroller,差距,呈现一个)变得(显然)更大.
当你打电话时,演示的缓慢也很明显:
- // Example: Delegate caught finished Sign In dialog,// dismiss it and instantly switch to Profile controller
- -(void)signInViewControllerDidFinishedSuccessfully
- {
- [self dismissViewControllerAnimated:NO completion:^{
- UserProfileViewController *userProfile = ...
- [self presentViewController:userProfile animated:NO];
- }];
- }
这应该是完全公平的代码,用于在iOS 7上执行直接转换,而不会看到父视图控制器的可见轻松.现在,同样的事情 – 父进程在转换期间轻弹,即使它们都没有动画处理.
解决方法
我不知道这个要求是限制有root视图控制器,并在那里提供任何东西.
但是根据你的代码,这是有欢迎的视图控制器的事情,我认为在这种情况下,这个逻辑更有用.
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
- // Conditions
- if (#first launch condition#) {
- // quite small controller containing Welcome showcase
- WelcomeViewController *w = ....
- //It can be navigation or tab bar controller which have "w" as rootviewcontroller
- [self.window setRootViewController:w];
- }
- else if (#last opened item condition#) {
- // pretty big container,root view controller contains
- // a grid view which opens Item detail container the same way
- ItemDetailController *item = ....
- //It can be navigation or tab bar controller which have "item" as rootviewcontroller
- [self.window setRootViewController:item];
- }
- [self.window makeKeyAndVisible];
- }