iphone cocoa cocoa-touch design model-view-controller

iphone - En MVC, ¿dónde colocas referencias a tus clases modelo?



cocoa cocoa-touch (5)

Me he estado preguntando por un tiempo, después de preguntar a diferentes personas y sin que ninguna de ellas ofreciera lo que yo llamaría una "respuesta al menos un poco concreta":

Pregunta:

¿Dónde, en una aplicación para iPhone debe una aplicación mantener las referencias a sus Clases de modelos (utilizando el enfoque MVC )?

En las aplicaciones de iPhone (y Cocoa) tenemos lo que llamamos el "delegado de la aplicación", que básicamente inicia nuestra aplicación y en nuestros controladores, también maneja los eventos de UITouch.

Entonces, ¿el delegado de la aplicación es un controlador? una clase modelo? ninguno de los dos? Creo que no saber eso también hace que sea confuso saber dónde poner las referencias del modelo.

Ejemplo:

Usted tiene el delegado de la aplicación, ese delegado contiene una referencia al controlador de vista de su aplicación. Si mi aplicación usaría la clase de modelo A (que es una clase de daemon de servidor web) y una clase B que almacena datos consultados por ese servidor web.

¿Dónde guardarían las referencias a A y B? (¿Delegado a la aplicación? ¿Controlador de vista? ¿Ambos?)

Aquí hay muchas opciones, pero a modo de ejemplo, me gustaría saber cómo usarían mvc para armar esta aplicación que solo usa una Vista.


En la mayoría de los casos, encuentro que AppDelegate proporciona un buen lugar para colocar algunas funciones básicas (como una imagen de fondo que desea aplicar en cada controlador), pero que deseará tener controladores adicionales y código de modelo en otro lugar. Un NavController o un RootController a menudo se ubicarían como una propiedad en su AppDelegate.

Por lo tanto, diría que está en algún lugar entre "ninguno" y "controlador", pero se inclina más hacia "ninguno". Definitivamente no es "modelo"!


¿Dónde, en una aplicación de iPhone debe una aplicación mantener las referencias a sus Clases de modelos (utilizando el enfoque MVC)?

La capa de controlador mantiene referencias a la capa del modelo.

Entonces, ¿el delegado de la aplicación es un controlador? una clase modelo? ninguno de los dos?

El delegado de la aplicación es un controlador.

¿Dónde guardarían las referencias a A y B?

A y B son clases de modelo que generalmente serían creadas y propiedad de la capa de controlador.

Realmente me gustaría saber cómo usarían mvc para armar esta aplicación que solo usa una Vista.

El objetivo de la capa del controlador es permitir que el modelo y las capas sean independientes. El modelo no debería saber nada sobre el controlador o ver capas. La vista no debería saber nada sobre el controlador o las capas del modelo. El trabajo del controlador es ser un adaptador de dos extremos para el modelo en un lado y la vista en el otro.

Configuraría tu aplicación de ejemplo así:

  • UIApplication delega en AppDelegate.
  • Si el funcionamiento de su clase de servidor (A) es simple:
    • AppDelegate crea y posee instancia (s) de clase de servidor A.
  • Si el funcionamiento de su clase de servidor (A) es complicado:
    • Cree una clase de controlador dedicada (C) para controlar el servidor.
    • AppDelegate crea y posee instancia (s) de clase C. Una instancia de (C) para cada instancia de (A).
    • Cada instancia de la clase C crea y posee una instancia de la clase A.
  • AppDelegate crea y posee una instancia de su clase ViewController, que carga y posee su vista.

No está claro en la pregunta cuál es el propósito de la clase B.

  • Si se trata de un fragmento de datos para uso exclusivo de A (como datos de configuración o datos de sitios web estáticos), quisiera que el servidor (A) lo cree y lo tenga.
  • Si se trata de datos que se crean durante la operación del servidor y deben mostrarse en la vista, entonces es probable que desee algo como:
    • Una matriz mutable propiedad de A, para contener instancias de B.
    • Otra clase de controlador (D) para hacer referencia a esa matriz y actuar como un origen de datos / delegado a su vista.

En mis aplicaciones, generalmente cambio el nombre de la clase AppDelegate a AppController, si eso ayuda a explicar mejor las cosas conceptualmente. Su controlador de aplicación es responsable de crear y / o configurar el controlador modelo (que gestiona su colección de objetos modelo) y controlar ventanas o vistas, establecer referencias entre ellos si es necesario y llamar a los métodos en estos controladores en respuesta a los métodos delegados NSApplication o métodos de acción de alto nivel desde el menú principal. Dependiendo de cuán compleja sea su aplicación, es posible que también tenga controladores adicionales de modelo o vista que se creen fuera de su controlador de aplicación.

Por supuesto, si tiene una aplicación simple, no hay una razón real para que su controlador de aplicaciones no juegue el papel del controlador modelo si lo desea. Lo que desea evitar es un archivo con cientos de líneas de código, todas ellas haciendo tareas conceptualmente no relacionadas.


Es tentador poner todo en AppDelegate, pero si comienza a hacer esto, entonces su AppDelegate estará lleno de hacks de referencia. Si estás haciendo un MVC estricto, entonces deberías tener 3 cosas:

  • Un modelo
  • Un controlador de visualización (solo para la lógica de visualización)
  • Un controlador (para coordinar entre la vista y el modelo)

Entonces, por ejemplo, tengo un modelo Foo y un controlador Foo. Quisiera:

  • Foo.m (Modelo)
  • FooViewController.m (muestra un Foo)
  • FooController.m (Controla la lógica)

Y finalmente, para responder a su pregunta, almacenaría mis referencias a Foo''s en el Foo Controller. Me gusta usar singletons para mis controladores, pero así soy yo. Si usa un singleton, puede hacer algo como esto: [[FooController sharedInstance] listOfFoos] para obtener su Foo


Tradicionalmente, el controlador crea el Modelo y luego inicializa la Vista con ese modelo. Luego, el controlador escucha los cambios en el modelo y ve y coordina el flujo del programa a través de este. Esa sería mi respuesta genérica, tal vez las cosas en la práctica serían diferentes para el desarrollo de iPhone.