2009-03-16 44 views
119

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

Respuesta

215

Normalmente evito el enfoque de diseño implícito en el uso que hace 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 la aplicación es un objeto que recibe notificaciones cuando el objeto UIApplication alcanza ciertos estados. En muchos aspectos, es un patrón de Observador uno-a-uno especializado.

Esto significa que el "área de preocupación" para AppDelegate es el manejo de estados de aplicación UIA especiales. El más importante de estos son:

  • applicationDidFinishLaunching: - bueno para el manejo de la configuración en el arranque y la construcción
  • applicationWillTerminate: - bueno para la limpieza al final

Usted debe evitar poner otra funcionalidad en AppDelegate ya que realmente no pertenecen allí. Cualquier otra funcionalidad incluye:

    datos
  • Documento - usted debe tener un producto único gestor de documentos (para múltiples aplicaciones de documentos) o un producto único documento (para aplicaciones de documentos individuales) controladores
  • Botón/tabla/vista, vista delegado métodos u otro manejo de vista (excepto para la construcción de la vista de nivel superior en applicationDidFinishLaunching :) - este trabajo debe estar en las respectivas clases de controlador de vista.

Muchas personas agrupan estas cosas en su AppDelegate porque son flojas o porque creen 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 escala.

+2

Matt, la última oración no tiene sentido. – Abizern

+3

Lo siento, Abizern. He arreglado la redacción, ahora. –

+4

+1 Esta es una respuesta excelente. Estaba mirando un código de ejemplo que tenía subvistas. Llamada a la aplicación Delegar 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

21

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

El delegado de aplicación 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.

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

+0

Te doy +1 porque tener todos tus controladores de UI en AppDelegate es menos complicado que crear todas esas clases personalizadas para él. – rwols

+2

@rwols tenga cuidado, separar sus preocupaciones ayuda a tener un código más limpio y es menos complicado depurarlo, debe tomarse el tiempo para crear esas clases personalizadas y no poner a todos sus observadores en un solo archivo. – wheeliez

1

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

programadores nuevos a este lenguaje siempre tienen la misma pregunta - lo hace el inicio del programa 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 función a continuación:

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

UIApplicationMain da inicio a la infraestructura de bucle de ejecución y aplicación Cocoa Touch, que crea un objeto UIApplication.Nuestra aplicación necesita contenido, por lo que Objective-c usa 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.

+0

por favor alguien me puede hacer entender lo que está mal en la respuesta anterior –

+2

Parece confuso porque a) usted no usa la puntuación/ortografía/gramática adecuada, b) está fuera de tema, ya que realmente no responde pregunta el cartel original preguntado. – Kay

-1

@Shivam, gracias.

Por lo que entiendo de appDelegate, está cerca de lo que es Application en Android. El viewDidLoad, viewDidDisappear es 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, hasta las notificaciones que se muestran. Si necesita que su código haga algo especial cuando ocurren estos eventos system, debe escribir el código de los métodos.

En Android utilizamos , onDestroy, onCreate como métodos de devolución de llamada para manejar dichos eventos del sistema.

+0

Los métodos 'onPause',' onCreate' y 'onDestroy' de Android son más similares a los métodos' viewDidDisappear', 'viewDidLoad' del ciclo de vida de un Controlador de Vista de iOS. Si tiene que comparar, yo diría que la clase 'Application' de Android estaría más cerca del' AppDelegate' de iOS. –

+0

Gracias, si puedes mejorar mi respuesta, por favor hazlo. Eliminaré mi respuesta después de leer la tuya. – Siddharth

Cuestiones relacionadas