2012-04-15 16 views
6

Soy nuevo en el desarrollo de iOS, por lo que agradecería algunos comentarios.Comunicación entre el modelo y el controlador: iOS

Estoy tratando de construir un cliente iOS para mi servicio web. Hasta ahora esto es lo que he hecho:

Estoy implementando dos vistas (aplicación basada en la utilidad usando Storyboard). En la vista principal, utilizo un campo de texto y un botón de búsqueda, donde el usuario puede ingresar una consulta y luego hacer clic en el botón de búsqueda. Una vez que se hace clic en el botón de búsqueda, mi intención es leer el valor del campo de texto y usarlo en mi llamada de descanso a mi servicio web. Mi servicio web responde con un archivo JSON con los resultados de la consulta, que analizo y muestro en el área de texto de la vista secundaria.

Sé cómo hacer la llamada tranquila en iOS y cómo hacer el análisis JSON, así como mostrar los resultados en la pantalla (al menos las cosas de texto, pero esa es otra pregunta diferente). Pero mi intención es aprender e implementar los principios básicos de MVC para mi aplicación.

Según MVC, el controlador actualiza la vista, y el modelo envía una notificación de transmisión que el controlador puede escuchar y saber si hay algún cambio en el objeto. Entonces, esto es lo que idealmente me gustaría hacer:

Mi modelo: mi modelo manejaría la llamada REST, consideraría la respuesta JSON, la analizaría y obtendría los valores resultantes que quiero mostrar en la vista.

Mi controlador - Me gustaría que mi controlador escuche mi modelo y obtenga los valores resultantes de Model y los muestre en View.

Usando una manera rápida y sucia, puedo implementar la llamada RESTful, el análisis JSON y mostrar los valores resultantes, todo dentro del Controlador, pero con esta técnica, si mi vista cambia mañana, entonces tengo que volver a escribir mi código . O si quiero agregar nuevas funciones, entonces tengo que cambiar mi controlador. Así que, idealmente, me gustaría tener un modelo básico que no tenga conocimiento de cómo se ve la vista, y simplemente dejemos que el controlador tome los resultados del modelo y los muestre en la vista.

Según lo que he leído hasta ahora en los resultados de búsqueda de Google, dos formas de hacerlo son a) Observación de valores clave yb) Centro de notificaciones.

Durante los últimos 2 días, estoy tratando de encontrar una buena manera de implementar el centro de notificaciones o leer más sobre él, no estoy obteniendo una buena pista. Algunas de las preguntas que tengo son, ¿puedo enviar el valor de resultados de String usando el centro de notificaciones que mi controlador selecciona? ¿Cómo funciona realmente el Centro de notificaciones con los valores de cadena? ¿Dónde puedo encontrar algunos buenos ejemplos?

Así que cualquier ayuda con respecto a esto será muy apreciada.

+1

¿Realmente desea que su MODELO maneje la comunicación con el servicio RESTful? – Till

Respuesta

12

Algunas de las preguntas que tengo son, ¿puedo enviar el valor resultados de String utilizando el centro de notificaciones que mi controlador recoge?

Sí, eso se haría comúnmente con la propiedad userInfo de NSNotification. userInfo es un NSDictionary simple que puede contener instancias de NSObject objetos derivados indexados por claves que se adhieren al protocolo NSCopying (comúnmente se utiliza NSString). Tenga en cuenta que el diccionario (userInfo) conservará su objeto/s de parámetro.


¿De qué manera el centro de notificaciones realmente trabajar con valores de cadena?

Bueno, eso depende de cómo desee que funcione. Pero a un lado, mire abajo.


¿Dónde puedo encontrar algunos buenos ejemplos?

Tal vez éste ayuda ...


Ejemplo

El receptor (controlador) se registra para la notificación:

- (void)registerForNotifications 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(modelObjectUpdatedString:) 
               name:@"StringUpdated" 
               object:nil]; 
} 

remitente (modelo) notifique el mundo:

- (void)stringUpdateWith:(NSString *)theString 
{ 
    self.string = theString; 
    [[[NSNotificationCenter defaultCenter] postNotificationName:@"StringUpdated" 
                 object:self 
                 userInfo:[NSDictionary dictionaryWithObjectsAndKeys:self.string, @"String", nil]]; 
} 

El receptor (controlador) recibe la notificación dentro de su manejador:

- (void)modelObjectUpdatedString:(NSNotification *)notification 
{ 
    ModelObject *postingObject = [notification object]; 
    NSString *string = [[notification userInfo] 
     objectForKey:@"String"]; 
    ... 
} 
+2

Esta es una respuesta perfecta. Muchas gracias por una respuesta clara y concisa. Esto es exactamente lo que estaba buscando. – BlueChips23

4

Usted está pensando por el camino correcto, pero aún no del todo. Como Till "señala" en su comentario, no debe manejar la comunicación RESTful dentro de su modelo. Si yo fuera usted, crearía una clase de utilidad responsable de obtener la información, y luego una clase responsable de mantener los datos (esta última clase es su modelo).

Sería inteligente crear un método de clase que asigne e inicie una nueva instancia de este objeto, creada a partir de los datos JSON obtenidos a través de su clase de comunicador RESTful.

Desde su punto de vista regulador:

RESTHelper *rest = [RESTHelper restHelperWithURL:yourRESTURL]; 
YourModel *model = [YourModel modelWithJSON:[rest fetchObjectWithID:1]]; 
// Present your models data in the view. 

Usted puede beneficiarse del uso de CoreData aquí, y le animo fuertemente a mirar en eso.

+0

Buenos consejos aquí. Gracias por guiarme en la dirección correcta. Estos son los tipos de comentarios que esperaba obtener, ya que soy nuevo en el desarrollo de iOS, y quiero obtener los conceptos básicos correctos, antes de hacer cualquier aplicación complicada. – BlueChips23

+0

No debe usar NSNotificationCenter a menos que tenga un caso en el que los bloques, KVO o la delegación no puedan hacer el trabajo. –

+0

Hola, Rasmus, también estoy aprendiendo sobre IOS. (No tan nuevo en OO). ¿Sugeriría entonces que la clase restHelper "devuelva la llamada" a un protocolo en el Modelo, una vez que tenga algunos datos? ¿Y podría explicar por qué usa [rest fetchObjectWithID: 1]? Sé que lo encontré en los videos de Stanford, pero parece que destruí esas células cerebrales ... – Greycon

Cuestiones relacionadas