¿Para qué sirve el AppDelegate y cómo sé cuándo usarlo?

146

Estoy empezando a trabajar en aplicaciones para iPhone. ¿Cómo sé cuándo debería poner cosas en AppDelegate en lugar de una clase personalizada? ¿Existe una regla o algún tipo de analogía con otro lenguaje de programación como Python o PHP que use un patrón similar a AppDelegate?

resolución
fuente

Respuestas:

255

Normalmente evito el enfoque de diseño que implica el uso de Andrew del término "corazón de su aplicación". Lo que quiero decir con esto es que creo que debería evitar agrupar demasiadas cosas en una ubicación central: un buen diseño de programa normalmente implica separar la funcionalidad por "área de preocupación".

Un objeto delegado es un objeto que recibe una notificación cuando el objeto al que está conectado alcanza ciertos eventos o estados. En este caso, el delegado de aplicaciones es un objeto que recibe notificaciones cuando el objeto UIApplication alcanza ciertos estados. En muchos aspectos, es un patrón de Observador especializado uno a uno.

Esto significa que el "área de preocupación" para AppDelegate está manejando estados especiales de aplicación UIA. Los más importantes de estos son:

  • applicationDidFinishLaunching: - bueno para manejar la configuración y construcción al inicio
  • applicationWillTerminate: - bueno para limpiar al final

Debe evitar poner otras funciones en AppDelegate ya que realmente no pertenecen allí. Dicha otra funcionalidad incluye:

  • Datos del documento: debe tener un administrador de documentos singleton (para múltiples aplicaciones de documentos) o un documento singleton (para aplicaciones de un solo documento)
  • Controladores de botón / tabla / vista, métodos de delegado de vista u otro manejo de vista (excepto para la construcción de la vista de nivel superior en applicationDidFinishLaunching :): este trabajo debe realizarse en las clases de controlador de vista respectivas.

Muchas personas agrupan estas cosas en su AppDelegate porque son flojos o piensan que AppDelegate controla todo el programa. Debe evitar la centralización en su AppDelegate ya que enturbia las áreas de preocupación en la aplicación y no se escala.

Matt Gallagher
fuente
8
+1 Esta es una excelente respuesta. Estaba mirando un código de muestra que tenía subvistas, llame a appDelegate para indicarle a un controlador de vista que cambie a una subvista diferente, y eso se sintió como un olor a código. Es bueno saber que mi nariz todavía funciona.
Alan
2
a veces vemos algo así en los tutoriales en línea: AppDelegate * del = [AppDelegate sharedAppDelegate]; (vea developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… ) ¿qué significa eso? puedo ver ejemplos de su uso, pero realmente no entiendo la teoría detrás de esto (vea este ejemplo: developer.apple.com/library/ios/#samplecode/… )
abbood
27

El delegado de su aplicación es el corazón de su aplicación. Es efectivamente su "controlador de programa".

El delegado de aplicaciones es la clase que recibe mensajes a nivel de aplicación, incluido el mensaje applicationDidFinishLaunching más comúnmente utilizado para iniciar la creación de otras vistas.

Si bien no es exactamente similar, podría considerarse como la rutina "main ()" de su programa Cocoa.

Andrew Grant
fuente
Te doy +1 porque tener todos tus controladores de UI en AppDelegate es menos complicado que crear todas esas clases personalizadas para él.
rwols
3
@rwols tenga cuidado, separar sus preocupaciones ayuda a obtener un código más limpio y es menos complicado depurar, debe tomarse el tiempo para crear esa clase personalizada y no poner a todos sus observadores en un solo archivo.
wheeliez
2

@ Shivam, gracias.

Por lo que entiendo appDelegate, está cerca de lo que Applicationes en Android. El viewDidLoad, viewDidDisappeares comparable al ciclo de vida de Android. Cada aplicación tiene un ciclo de vida, desde el lanzamiento hasta las interrupciones de las llamadas entrantes y las notificaciones que aparecen. Si necesita que su código haga algo especial cuando systemse producen estos eventos, debe escribir el código de los métodos.

En Android usamos onPause, onDestroy, onCreateun poco de devolución de llamada métodos para manejar este tipo de eventos del sistema.

Siddharth
fuente
Las onPause, onCreatey los onDestroymétodos de Android son más similares a la viewDidDisappear, viewDidLoadmétodos de ciclo de vida de una vista de Controlador de iOS. Si tiene que comparar, diría que la Applicationclase de Android estaría más cerca de la AppDelegatede iOS.
Shivam Bhalla
Gracias, si puedes mejorar mi respuesta, por favor hazlo. Eliminaré mi respuesta después de leer la tuya.
Siddharth
1

Espero que esto ayude un poco más ...

Los programadores nuevos en este lenguaje siempre tienen la misma pregunta: ¿el programa parte de un método principal? Sí, tienes razón en este caso; Las aplicaciones IOS también comienzan desde un método principal.
Su clase principal llama a la siguiente función:

 UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 

UIApplicationMain inicia el ciclo de ejecución de Cocoa Touch y la infraestructura de la aplicación que crea un UIApplicationobjeto. Nuestra aplicación necesita contenido, por lo que Objective-C utiliza un delegado para manejar esto. Es por eso que lo llamamos AppDelegate (actuar como delegado de UIApplication). Implementamos algunos de los métodos opcionales de ese delegado y se comporta en consecuencia.

Anurag Bhakuni
fuente
por favor, alguien puede hacerme entender lo que está mal en la respuesta anterior
Anurag Bhakuni
2
Parece confundido porque a) no utiliza la puntuación / ortografía / gramática adecuadas, b) está fuera de tema, ya que realmente no responde a la pregunta que hizo el póster original.
Kay