Descartar VC muy lento debido a la reproducción automática y muchas subvenciones.

Tengo una scrollview cargada con muchas subvistas, y por razones que no voy a entrar, he optado por cell reutilización de cell y una UITableView . Funciona bien, excepto por un pequeño retraso inicial del hilo principal cuando se completa la vista. Sin embargo, cada vez que se descarta un VC "on top" ( eg after presenting a modal overtop ), hay un retraso significativo (2-3 segundos). Lo ejecuté a través del perfilador y la traza de la stack se adentra muy profundamente en IOS / Autolayout, como se ve en la image adjunta.

El código parece entrar en NSLayoutConstraint("+0x06 calll "-[NSLayoutConstraint _addToEngine:]+0x0b") .

¿Hay algo que pueda hacer para eludir esta aparente reaplicación de restricciones?

pila de datos

Por qué el performance de su vista de desplazamiento es pobre

Desde la búsqueda de su rastreo, la raíz de su problema comienza cuando hace la transición: gasta el 80% + de su time en -[UITransitionView transition:fromView:toView:removeFromView:] . Este método agrega inmediatamente la vista de transición a la jerarquía de vistas (la -addSubview: llamada siguiente), que requiere un pase de Diseño automático completo.

No tengo conocimiento de ninguna forma de forzar el sistema normal de transición del controller de vista iOS para mantener su antigua vista en segundo plano, por así decirlo, a fin de evitar este pase de layout automático. (Tal enfoque podría encontrarse en su propio set de problemas, si múltiples vistas se astackn fuera de la pantalla y comienzan a causar presión en la memory).

Aceleración del layout automático en su estructura existente

A pesar de lo anterior, puede intentar optimizar su pase de layout automático de dos maneras. Primero, vuelva a trabajar en la vista de desplazamiento para tener less subvistas. El soporte técnico para desarrolladores de Apple también recomendó a veces aplanar la jerarquía de su vista; haciendo que el layout automático haga less recursiones a veces puede ser útil. (Ver, por ejemplo, las testings de performance realizadas por Florian Kugler y Martin Pilkington ).

También debe asegurarse siempre de que una restricción esté instalada en la vista más profunda posible dentro de su jerarquía, al mismo time que se encuentra en el antepasado común de las dos vistas a las que se refiere. Por ejemplo, si la vista A tiene subvistas B y C, desearía una restricción que haga reference únicamente a la vista C instalada en la vista C, no a la vista A; sin embargo, una restricción relacionada con B y C debería existir en A. Esta es una buena guía para todos los trabajos de Diseño automático, no solo en este caso particular; Mientras más se instala una restricción en la jerarquía, más rápido puede funcionar el solucionador subyacente en cualquier nivel particular.

Cambiar tu enfoque

UITableView puede evitar este problema proporcionando una especie de interrupción en el sistema de layout automático: la vista de tabla puede posicionarse correctamente con restricciones, luego usar sus propios methods de delegado (como -tableView:heightForRowAtIndexPath: y algún layout interno de magia para ejecutar Diseño automático de forma individual para cada celda, sin necesidad de que toda la vista se distribuya de una vez. Los UIScrollViews regulares no tienen el lujo de esta optimization.

Sé que usted dijo que tiene razones para no adoptar un UITableView aquí, pero podría considerar revisar esos motivos. Puede ver algunas mejoras de velocidad muy significativas al cambiar a UITableView e implementar el método delegate -tableView:estimatedHeightForRowAtIndexPath: que le permite cortocircuitar muchos cálculos de layout automático en el momento de carga de visualización y diferirlos hasta el punto en el que está a punto desplácese por una nueva celda en la pantalla. Se ha realizado una experimentación bastante significativa en esta dirección, tanto aquí en StackOverflow como por parte de otros miembros de la comunidad. (Una búsqueda rápida de "Altura de disposition automática de UITableView" mostrará decenas de resultados).

¡Buena suerte!