2011-05-30 7 views
6

Por ejemplo, tengo una clase de modelo que maneja la recepción de mensajes bluetooth de otros iPhones. Cuando recibo uno de estos mensajes, necesito actualizar una vista. Creo que la forma estándar de hacerlo es a través del controlador de vista. El controlador de vista tiene una referencia al modelo y a la vista, por lo que puede comunicarse con cada uno de ellos.¿Cuál es la forma recomendada para que un modelo se comunique con un controlador de vista?

Sin embargo, ¿cómo deberían enviar mensajes de vuelta al VC? Podrían tener una referencia al controlador de vista cada uno (como una propiedad, con asignar no retener). ¿Esa es una mala práctica (si no me equivoco es una referencia circular)?
¿Hay formas alternativas de hacer esto? He considerado el patrón de delegados, pero escribir un delegado completo y todo parece ser un montón de trabajo para un problema simple. Alternativamente, si crees que estoy pensando demasiado, ¡no dudes en decírmelo!

[Creo que esta pregunta probablemente ha subido delante, parece bastante común, pero he buscado un poco y no encontré mucho]

Gracias por su ayuda,

+0

Puede agregar un delegado a su modelo y hacer que apunte al VC. – Shirkrin

+1

También puede publicar notificaciones usando un centro de notificación local y luego escuchar esas notificaciones usando su VC. – Shirkrin

+0

Voy a analizar el uso de NSNotificationCenter, gracias. ¿Quiere decir crear el mío propio en lugar de usar el predeterminado (devuelto por el método singleton defaultCenter)? –

Respuesta

6

Por principio hay 3 técnicas diferentes:

  1. Delegación
  2. MVA (valor-clave de Observación)
  3. Notificaciones

Si el modelo sólo tiene que informar a un objeto (su ver controlador) de cambios, la delegación es el camino a seguir. Puede parecer un trabajo extra crear una nueva interfaz, agregar la propiedad de delegado al modelo, etc., pero definitivamente vale la pena en términos de flexibilidad, reutilización de código, diseño, etc. La delegación es un patrón estándar en la programación de Cocoa y es utilizado ampliamente en las API de Apple.

Si su modelo necesita informar varios objetos de cambios, desea utilizar KVO o notificaciones. Con KVO puede suscribirse para cambiar eventos para una propiedad o clave específica en el modelo. Por ejemplo, cuando la propiedad 'mensajes' en su modelo cambia, cualquier oyente adjunto puede ser notificado del cambio y responder en consecuencia.

Las notificaciones se utilizan cuando desea enviar mensajes de toda la aplicación a múltiples oyentes. Los ejemplos de las API estándar son notificaciones de teclado (cuando se muestra/descarta el teclado) y cambios en la orientación de la interfaz.

Por lo tanto, en su caso, la delegación o KVO probablemente sea la mejor opción.

+0

Guau, gracias por esa mina de información. Honestamente, nunca había oído hablar de KVO, pero ahora voy a echarle un vistazo; ¡podría ser justo lo que necesito! Gracias. –

0

nunca hizo esto en una aplicación iOS, pero en términos generales de mvc, a veces tiene más sentido (y mantiene el código más limpio) actualizar la vista directamente desde el modelo sí. Esto está bien en mi opinión, pero acopla el modelo a la vista, lo cual es malo. Por lo tanto, para resolver esto, debe implementar un patrón de diseño de observador (broadcast-receive) (o usar el sistema integrado de emisor/receptor de eventos ios -> NSNotificationCenter). De esta forma, cuando sucede algo que cambia el modelo, el modelo emitirá un "par", ya sea que alguien escuche ese evento o no, ya no es su problema, por lo que desacopla la vista del modelo.

Cuestiones relacionadas