MVC y delegación

7

Soy un programador de iOS principiante y uso el modelo Model-View-Controller como patrón de diseño: mi modelo no sabe nada sobre mi vista (para que sea compatible con cualquier vista), mi vista no saber algo sobre mi modelo para que interactúen a través de mi controlador. Una forma muy habitual para que una vista interactúe con el controlador es a través de la delegación: cuando el usuario interactúa con la aplicación, mi vista notificará a mi controlador, que puede llamar a algunos métodos de mi modelo y actualizar mi vista, si es necesario.

Sin embargo, ¿tendría sentido también hacer que mi controlador sea el delegado de mi modelo? No estoy convencido de que este es el camino a seguir. Podría ser útil para mi modelo notificar a mi controlador de algún proceso que se está terminando, por ejemplo, o solicitar información adicional del usuario si no tiene suficiente información para completar la tarea. Sin embargo, el inconveniente de esto es que mi controlador sería el delegado tanto de mi controlador como de mi modelo, por lo que realmente no habría una manera adecuada de notificar los cambios a mi modelo, y viceversa. (corrígeme si me equivoco)

Conclusión: Realmente no creo que sea una buena idea tener a mi controlador como delegado de mi modelo, pero simplemente ser el delegado de mi opinión estaría bien. ¿Es así como manejan la mayoría de los modelos MVC? ¿O hay una manera de que el controlador sea el delegado tanto del controlador como del modelo, con una comunicación adecuada entre ellos?

Como dije, soy un principiante, así que quiero hacer esas cosas de la manera correcta de inmediato, en lugar de pasar un montón de horas en modelos que no funcionarán de todos modos. :)

    
pregunta Tim Vermeulen 14.10.2012 - 23:27

2 respuestas

4

Hablaré específicamente para iOS, ya que tiene sus propios conceptos y algunas características del lenguaje hacen que su manera de hacer las cosas se ajuste. A menudo, en iOS, las interacciones Controlador - Capa del modelo se basan en alguna variante del patrón Observer (observación clave-valor (KVO) pero también NSNotification ). Encuentro que la capa modelo a menudo no participa en el mismo tipo de interacción interactiva que ocurre en la interfaz de capa Ver - Controlador (piense en la complejidad de una vista de tabla dinámica y con todas las funciones), por lo que la delegación no es lo más natural ajuste. Por lo general, algo (la entrada del usuario, una solicitud de red, etc.) cambia el modelo y el controlador responde en consecuencia actualizando la vista. Pero la delegación todavía se usa en interacciones dinámicas de larga duración, como una vista de tabla que muestra el contenido de un conjunto de datos que se actualiza con frecuencia (consulte NSFetchedResultsController ).

En cuanto a su pregunta de que el controlador sea el delegado de su vista y su modelo, no hay otro problema inherente que degradar la cohesión de su controlador, y a veces se convierte en una buena opción para dividir la capa del controlador en Controladores de vista y controladores de datos. El uso de KVO o NSNotification para observar los cambios en la capa del modelo suele ser lo suficientemente directo como para que no encuentre una necesidad urgente de extraer una nueva clase.

    
respondido por el Carl Veazey 15.10.2012 - 01:35
1

Cuando se habla de controladores con respecto a iOS, a menudo se habla de controladores de vista, objetos destinados a administrar jerarquías de vista. Cada "pantalla" en una aplicación de iOS tiene su propio controlador de vista, y estos controladores van y vienen a medida que el usuario navega a través de la aplicación.

El modelo, por otro lado, es un objeto o gráfico de objetos que representan los datos en los que opera la aplicación, y no cambia solo porque el usuario se mueve en la aplicación.

Si va a usar un controlador de vista como delegado de su modelo, entonces querrá usar un controlador de vista cuya duración sea similar a la del modelo. En una aplicación basada en la navegación, eso generalmente significa el controlador de vista raíz, que a menudo es el objeto que creó el modelo en primer lugar. (Otro candidato es el delegado de la aplicación, que es otro objeto de larga duración que a veces crea el modelo).

No hay razón para que un controlador de vista no pueda ser el delegado de una o más vistas y también del modelo. Solo tenga cuidado de considerar el problema de por vida descrito anteriormente. Además, considere si su modelo realmente necesita un delegado, y si la delegación es la forma correcta de transmitir cualquier mensaje que el modelo deba enviar. Otras opciones incluyen KVO y notificaciones.

    
respondido por el Caleb 15.10.2012 - 06:50

Lea otras preguntas en las etiquetas