titles large big bar ios iphone performance cocoa-touch instruments

ios - big - swift navigation bar large title



Rendimiento lento para presentViewController: ¿depende de la complejidad del controlador de presentación? (5)

Añadiendo la línea:

CFRunLoopWakeUp(CFRunLoopGetCurrent());

Después:

[self presentViewController:navController animated:YES completion:nil];

Arreglado el problema para mí.

Respuesta tomada de este hilo . Encontrado gracias al comentario de Eugene H.

Estoy presentando un controlador de vista:

SCAAboutController2 *controller = [[SCAAboutController2 alloc] initWithNibName:nil bundle:nil]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller]; [self presentViewController:navController animated:YES completion:nil];

El dispositivo se cuelga durante 3-4 segundos antes de la presentación. He intentado diagnosticar esto utilizando instrumentos, pero parece que la mayor parte del tiempo se dedica main :

Aquí está el mismo perfil pero con las bibliotecas del sistema sin ocultar:

Ninguno de estos mensajes es reconocible para mí, por lo que no estoy seguro de cómo comenzar a depurar mi problema de rendimiento.

Leí en otra parte que debería comprobar que el código principal se está ejecutando en el hilo principal. Sin embargo, el siguiente cambio no está mejorando nada:

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]; });

Rápidamente me he quedado sin ideas sobre cómo progresar. ¿Cómo podría investigar más y / o cuál podría ser la causa raíz de la presentación lenta?

Editar

Algunos descubrimientos confusos:

  • He eliminado todo el código del controlador de vista presentado. El rendimiento no se ve afectado.
  • Tengo otro controlador que presento desde el mismo lugar a través de un botón diferente. Es igualmente lento.
  • El controlador de presentación tiene bastantes subvistas y restricciones, incluso algunos controladores de vista secundarios. Eliminar el código que llena estos resuelve el problema.
  • no se agrega nada en el viewWillDisappear del controlador de presentación.

Editar 2

Descubrí que los problemas se centran en una serie de restricciones de diseño que agrego en el controlador principal (de presentación). Específicamente, teamController algunos controladores secundarios (de tipo teamController ) y agrego la restricción:

[self.browser addConstraint:[NSLayoutConstraint constraintWithItem:teamController.view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.browser attribute:NSLayoutAttributeWidth multiplier:1 constant:0]];

Solo hay 10 controladores infantiles. También extraño: no tengo tales problemas si uso lo siguiente:

[self.browser.contentView addConstraint:[NSLayoutConstraint constraintWithItem:teamController.view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:200]];

Todavía estoy muy confundido en cuanto a por qué estas restricciones causan que se cuelgue la presentación de otro modo , y por qué una variación de la restricción se comporta de manera drásticamente diferente a la otra.


No estoy seguro de que este fuera el problema del autor original, pero aquí hay algo que me solucionó un problema similar: estaba tratando de presentar una vista desde didSelectRowAtIndexPath y tuve que llamar a deselectRowAtIndexPath antes. Si esto puede ayudar a alguien ...


Sé que estoy publicando la respuesta tarde de año. Pero si es útil para alguien más.

Intenta poner (código swift)

self.view.layer.shouldRasterize = true; self.view.layer.rasterizationScale = UIScreen.mainScreen().scale;

para el controlador de vista que se está presentando (y si no funciona, intente colocarlo también en el padre. Lo he puesto en ambos, simplemente ayuda a suavizar todas las demás animaciones)

Espero que esto ayude.


Su aplicación no responde debido a varias operaciones de agregar y quitar en un conjunto. Si haces un procesamiento pesado en el hilo principal, la aplicación se bloquea y deja de responder.

En pocas palabras, tiene un bucle que agrega objetos en un conjunto y lo hace en el hilo principal que hace que su aplicación sea lenta.

Si observas tus instrumentos, los botones de carga y visualización de la vista son bastante rápidos. initWithFrame, viewDidLoad está tomando menos del 4% del tiempo total. La mayoría de las veces se toma mediante el lanzamiento de NSISVairable y se retiene, lo cual se realiza alrededor de 500 veces. Así que estás haciendo algo con tu objeto de colección y probablemente está en un bucle. retener y liberar lleva tiempo y no debe hacerse en el hilo principal.

La solución simple es:

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // do all the heavy lifting here in background thread. }

¿Por qué el siguiente código no mejora nada:

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]; });

porque ya estás haciendo esto en el hilo principal y necesitas llamar a main_queue en el hilo de fondo. No debes hacer ninguna cosa de UI en el hilo de fondo.


Tuve un problema similar cuando la devolución de llamada estaba en un subproceso diferente al del subproceso principal. Utilizando

DispatchQueue.main.async { Your_UI_update_function() }

resuelve el problema de actualización de IU lenta para mí.