С момента тестирования моего приложения на 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 секунды, а затем мгновенно перерисовывает экран с представленным. Более того, медленность презентации начала вызывать предупреждение Unbalanced calls to begin/end appearance transitions _rootViewController
.
Первоначальный быстрый совет заключался в том, чтобы переместить оба условия с вызовами другой функции и вызвать его с нулевой задержкой, чтобы он обрабатывался в следующем цикле основного запуска:
[self performSelector:@selector(postAppFinishedPresentation) withObject:nil afterDelay:0];
или что-то в этом роде. Это устраняет проблему небезопасных вызовов, но визуальный пробел (rootviewcontroller, gap, представленный один) становится (очевидно) еще большим.
Медленность презентации также очевидна, когда вы вызываете что-то обычное, как:
// 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. Теперь то же самое - родительский щелчок во время перехода, даже он обрабатывается без анимации.
Кто-нибудь сталкивается с этим как проблема? Любые решения? Я бы хотел решить эту проблему без необходимости делать веселую магию с помощью UIWindow
для каждой вещи, в которой я нуждаюсь в безукоризненном прохождении.