2008-12-03 13 views
58

Estoy buscando poder hacer referencia a ciertos estados/objetos a través de cualquier lugar de mi aplicación. Por ejemplo, un usuario inicia sesión en su aplicación, necesito llamar a un servicio web y recuperar la información de los usuarios. A continuación, quiero ser capaz de acceder a esta información desde cualquier lugar de la aplicación con algo como lo siguiente:Uso adecuado de iPhone del delegado de aplicaciones

myAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
user = delegate.u; 

está estableciendo una variable de instancia como un objeto de usuario en el delegado de la aplicación y hacer referencia a partir de ahí cuando se necesita un pobre forma de hacerlo? Normalmente lo configuro allí cuando el usuario inicia sesión.

Quería saber cómo los profesionales manejan este.

Respuesta

52

Normalmente, sólo debe conectar las cosas al delegado de la aplicación si:

  • fueron creados a partir del mismo archivo SEMILLA como el delegado de la aplicación (es decir, elementos de interfaz de usuario estáticas en las interfaces de ventanilla única)
  • se asocian con el manejo de eventos de nivel de aplicación que pasa por el delegado de la aplicación (como el elemento de menú de la ventana de preferencias)

Para todo lo demás, debe crear un singleton que administre el acceso a ellos.

Jason Coco sugirió el enrutamiento a través del controlador de la aplicación. En mis programas, normalmente evito esto, ya que considero que implica demasiada responsabilidad en el nivel superior: creo que las cosas deberían autoadministrarse siempre que sea posible y que la gestión de nivel superior solo debe utilizarse cuando existe un requisito de coordinación entre pares. módulos de nivel.

No voy a vincular mi propio blog, pero si me busca en Google y en singletons, probablemente encontrará una publicación que escribí en detalle.

+1

Gracias Matt. ¿Te importa si pregunto a qué se refiere específicamente cuando dices el elemento de menú para la ventana de preferencias? – Coocoo4Cocoa

+1

Me encantaría leer su blog Matt, pero desafortunadamente no está en este momento. Espero que sea temporal. – Coocoo4Cocoa

+6

Enlace a la publicación del blog: http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html – Casebash

13

No veo ningún problema con su enfoque. Yo suelo usar un producto único para manejar esta situación:

// MyCommon.h: 
@interface MyCommon 
class MyCommon : NSObject 
{ 
    int user; 
}; 

@property(assign) int user; 

+ (MyCommon *)singleton; 

@end 

// MyCommon.m: 
@implementation MyCommon 

static MyCommon * MyCommon_Singleton = nil; 

+ (MyCommon *)singleton 
{ 
    if (nil == MyCommon_Singleton) 
    { 
     MyCommon_Singleton = [[MyCommon_Singleton alloc] init]; 
    } 

    return MyCommon_Singleton; 
} 
@end

El Singleton MyCommon se utiliza en cualquier lugar en mi solicitud de la siguiente manera:

int user = [MyCommon singleton].user;
+1

He publicado esto hace un par de años, y he aprendido algunas cosas desde entonces. Lo importante de darse cuenta acerca de los singleton es que no son diferentes de las variables globales. Eso no necesariamente significa que deben evitarse en todos los casos, simplemente significa que tienen los mismos inconvenientes, especialmente cuando se trata de una encapsulación adecuada y facilidad de prueba. En este caso, por ejemplo, se vuelve muy difícil probar clases individuales que dependen de '[MyCommon singleton]' de forma aislada sin establecer primero el valor global de 'usuario'. –

+0

Una buena alternativa al singleton accesible globalmente es usar inyección de dependencia. Básicamente crea el mismo objeto 'MyCommon' en el delegado de su aplicación, y luego lo pasa a cualquier objeto secundario que lo necesite, y luego continúa este proceso tan abajo en la jerarquía de objetos.Esto agrega un poco de trabajo en el camino, pero resulta en un programa mucho más orientado a objetos que es más fácil de mantener y depurar. –

+0

Para ver cómo se siente la comunidad de SO sobre el asunto, aquí hay un enlace a una pregunta que hice sobre singletons cuando comencé a hacer el cambio: http://stackoverflow.com/questions/474613 –

3

lo general, se le pediría controlador de la aplicación de esta información y que sería ser responsable de saber cómo almacenarlo/buscarlo en cualquier modelo de datos existente. El controlador de su aplicación puede ser o no el mismo que el de las aplicaciones delegadas (en la mayoría de las aplicaciones simples, es el mismo).

Cuestiones relacionadas