Se le conoce como ciclo de vida de una aplicación a la secuencia de eventos que se producen entre la ejecución y la terminación de la aplicación. Es muy importante entender el ciclo de vida de una aplicación para cualquier persona que desarrolle en iOS que quiera ofrecer una experiencia de usuario sin problemas. Así que veámoslo a detalle.
Cuando el usuario enciende el teléfono, no se ejecuta ninguna aplicación adicional a las que pertenecen al sistema operativo. En el momento que el usuario toca el icono de alguna aplicación, SpringBoard ejecuta dicha aplicación.
Mientras que SpringBoard
muestra la launch screen
de tu aplicación, la aplicación y las librerías necesarias para ejecutarla se cargan en la memoria. Una vez hecho esto, la aplicación inicia su ejecución y app delegate
comienza a recibir las notificaciones.
SpringBoard
es la aplicación estándar que gestiona la pantalla de inicio del iPhone. Algunas de sus tareas incluyen el inicio de WindowServer
, el lanzamiento y arranque de aplicaciones y la configuración de algunos de los ajustes del dispositivo en el arranque.
UIApplicationDelegate
es la entrada principal de las aplicaciones. Este es un protocolo que se debe implementar en la aplicación para recibir notificaciones sobre los eventos del usuario, como el inicio de la aplicación, que pase a segundo plano, la apertura de una notificación e incluso la finalización de la aplicación.
Por último, la clase UIResponder
hace que AppDelegate
pueda responder a los eventos del usuario y la UIApplicationDelegate
permite que AppDelegate
sea un objeto que se encargue de gestionar y responder al ciclo de vida de la aplicación.
Swift tiene una función llamada UIApplicationMain
que configura varios objetos clave e inicia la ejecución de la aplicación. En el core de cualquier aplicación de iOS se tiene un objeto llamado UIApplication
, el cual tiene como trabajo facilitar TODAS las interacciones entre el sistema y el resto de los objetos de la aplicación.
El UIApplication
se encarga de gestionar el bucle de eventos y también otros comportamientos de alto nivel de la aplicación. Además, informa de las transiciones y de algunos eventos especiales (como las notificaciones push entrantes) al delegate
de la aplicación.
Por otro lado, el AppDelegate
es el corazón del código personalizado, ya que este objeto trabaja de la mano con el UIApplication
para manejar:
<aside>
📌 El objeto AppDelegate es el único que se garantiza que está presente en todas las aplicaciones, por lo que a menudo se utiliza para configurar las estructuras de datos iniciales de la aplicación.
</aside>
El bucle de ejecución principal (main run loop) de una aplicación procesa todos los eventos relacionados con el usuario. El objeto UIApplication
configura el bucle de ejecución principal en el momento del lanzamiento y lo emplea para procesar los eventos y manejar las actualizaciones de las interfaces.
Como su nombre lo indica, este bucle se ejecuta en el hilo principal de la aplicación, lo que asegura que los eventos relacionados con el usuario se procesen en el orden que se van recibiendo.
Todos estos eventos se ponen en cola internamente por la aplicación y se van enviando uno a uno al bucle. El UIApplication
es el primer objeto que recibe el evento y toma la decisión sobre lo que hay que hacer. Por ejemplo: un evento de toque es usualmente despachado al objeto de la ventana principal, que, a su vez, lo despacha a la vista en la que ocurrió el toque.
En cualquier momento de una aplicación se tienen cinco estados que son:
Así como hay cinco estados del ciclo de vida de una aplicación, también hay cinco métodos para manejar cada uno de estos estados.
viewDidLoad
es llamado después de cargar la vista del controlador de memoria.
funcviewDidLoad()
Este método se llama después de que el controlador de la vista se haya cargado y solo funciona una vez. Esto quiere decir que no se llama continuamente.
viewWillAppear
notifica al controlador de la que la vista está a punto de ser añadida a una jerarquía de vistas.
funcviewWillAppear(_ animated: Bool)
Este método es llamado cada vez que aparece la vista. A diferencia de viewDidLoad
, es llamado una y otra vez. Por esta razón, las transacciones únicas y de alto costo no deberían hacerse aquí.
viewDidAppear
notifica al controlador que su vista fue agregada a una jerarquía de vistas.
funcviewDidAppear(_ animated: Bool)
En esta etapa la vista se carga y es visible para el usuario. En este método se pueden realizar operaciones costosas como la obtención de datos a través de la API, el almacenamiento de datos (coreData
, userDefaults
, etcétera) y la activación de los servicios de localización.
viewWillDisappear
notifica al controlador que su vista está a punto de ser eliminada de una jerarquía de vistas.
funcviewWillDisappear(_ animated: Bool)
La llamada a este método ocurre cada vez que la vista desaparece. Por la misma razón que con viewWillApper
, las transacciones únicas y de alto coste no deberían suceder aquí.
Se debe tener en cuenta que tanto viewWillAppear
y viewWillDisappear
no son llamados nuevamente cuando la aplicación se ejecuta en segundo plano.
viewDidDisappear
notifica al controlador de la vista que su vista fue eliminada de una jerarquía de vistas.
funcviewDidDisappear(_ animated: Bool)
Es posible anular este método para efectuar tareas adicionales asociadas a la eliminación u ocultación de la vista.
Ahora que ya sabes cómo funciona el ciclo de vida de una aplicación en iOS, tienes todas las herramientas para darle a tu usuario la mejor experiencia posible al utilizar las aplicaciones que tú desarrolles.
Si quieres conocer más sobre este lenguaje de programación llamado Swift, te invito a leer sobre 8 cosas que no sabías sobre Swift y si quieres aprender más sobre este lenguaje no dudes en pasarte por el Curso de Programación en Swift que te ayudará a dominar los conceptos necesarios para crear tus propias aplicaciones.
Recuerda: nunca pares de aprender. 💚
Me encantó este post Alex. Siempre me llamó la atención como funciona un OS móvil. Era algo que al buscarlo conseguía información muy abstracta y que me costaba comprender. Sin embargo este post tributa a mi entendimiento de estos sistemas.
.
Además me causa curiosidad como se integra lo expuesto conceptualmente a nivel de hardware.