2010-12-06 8 views
5

Hace poco vi los videos de 'Aplicaciones de red para el SO del iPhone' para la WWDC 2010 en iTunes U y el orador dijo que el mejor lugar para escribir el código de red está en el modelo. Esto me confundió porque siempre coloqué este código en las clases de controlador. ¿Puede alguien explicar por qué este es el mejor lugar para el código de red? Además, si es posible, proporcione un ejemplo, código o pseudocódigo, cualquiera funciona.ios código de red en el modelo?

Respuesta

8

Me pregunto si todos estamos usando la misma terminología. Esto es lo que usaría y creo (aunque lo digo sin demasiado contexto) lo que el presentador de la WWDC quiso decir:

  • Modelo. Los datos
  • Ver. Lo que parece en la interfaz de usuario
  • Controlador. La capa que media entre el Modelo y la Vista

Usando estas definiciones, el controlador es un lugar terrible para guardar cualquier código de red. No tiene nada que ver con la interacción entre la interfaz de usuario y los datos.

Por supuesto, no hay ninguna razón por la cual no pueda tener múltiples clases para su modelo: una para la representación de datos y otra para mediar entre su servicio web y su modelo de datos. En este sentido, sería un controlador pero, sin embargo, estaría en la capa modelo de la aplicación.

+0

Me refiero al código de red que, por ejemplo, descargaría registros para sincronizar con datos centrales o algo así. Entonces, el código de red para esto debe estar en las clases modelo. Pensé que las clases de modelo eran principalmente objetos de dominio utilizados para representar datos, no entiendo dónde encaja la red allí. ¿Quiere decir que tal vez algún tipo de fachada de administrador puede hacer esto, y quizás quiere decir que esta clase estaría en el modelo? Creo que quizás esté confundido con el lugar en el modelo al que debería ir este código y qué clases representan realmente el modelo. – marchinram

+0

Creo que su definición del modelo es demasiado estrecha. Diría que el modelo es un código que funciona con los datos independientemente de cómo funciona en la interfaz de usuario. Esto significa que el código de red está en el modelo _layer_ pero no necesariamente en la misma _class_ que su objeto de dominio. –

+0

Bien, así que estaba colgado del modelo de las clases de dominio, gracias +1 – marchinram

2

Hmmm ... eso parece ser un comentario bastante extraño, pero de nuevo, tal vez es válido en algunos contextos. Ciertamente, sé que mis modelos terminan teniendo un montón de código de red en ellos;

Es decir, el Modelo debe manejar todo lo que tenga que ver con los datos y acceder a ellos. Eso necesariamente significa que el Modelo incluirá el código para conectarse a lo que sea la tienda de respaldo para los datos.

Es posible que las partes del Modelo no tengan código de red, si los datos son locales. Pero tenga en cuenta que el código de red se utiliza para transferir datos de un lugar a otro; Si primero está codificando en función de los modelos, es probable que prácticamente todo su código de red termine allí.

2

Qué es la llamada Modelo en este post es, de hecho, la capa de dominio y no el contenedor de datos utilizado entre los controladores y vistas

Funcionamiento en red son generalmente asíncrona y su modelo es más probable que se presente para manejar la respuesta mientras que su controlador podría haber sido destruido por su navegación entre la solicitud y la respuesta. Eso podría bloquear su aplicación porque el delegado (el controlador en su caso) ya no está presente en la memoria y al menos crea pérdida de memoria porque el delegado generalmente es responsable de liberar el objeto de conexión.

+1

La respuesta aquí es asegurar que los objetos del controlador pueden cancelar cualquier solicitud durante el vuelo, y/o utilizar controladores únicos que pueden gestionar un gran conjunto de peticiones procedentes de múltiples fuentes. De hecho, yo diría que es exactamente lo contrario de lo que ha sugerido: los objetos de modelo deberían ser mucho más transitorios que los objetos de controlador, ya que solo deberían existir para representar pequeñas porciones de datos en la aplicación. –

+0

La confusión proviene del hecho de que MVC llevar el concepto de modelo para las vistas de las que llamo "vista del modelo" y cosa que pueda consultar esta hora de hablar del modelo, mientras que lo que llamo Modelo (VS modelo de vista) es de hecho lo es en algún momento call domain, repository, business layer, ... Obviamente, estoy totalmente de acuerdo en que el código de red no debería ocurrir en viewModels, que básicamente son contenedores de datos. – VdesmedT

4

Creo que el modelo es un lugar extremadamente terrible para implementar cualquier tipo de código de red. Dado que las operaciones en red deben proceder de manera asíncrona, un objeto controlador es el más adecuado para manejar las complejidades relacionadas con las solicitudes de activación y el manejo de la respuesta. Tiene sentido que un objeto modelo sepa cómo construirse a partir de los datos descargados (XML o JSON, por ejemplo), pero la mayoría del código de servicios que he visto en los objetos del modelo es una red síncrona mal escrita.

1

El "redes se realiza mejor en el modelo" es como usted dice explícitamente mencionado por el gurú de las redes de Apple Quinn Los esquimales durante la WWDC sesión de 2010.Después de haber completado recientemente dos aplicaciones bastante importantes con una red completa, estoy muy interesado en probar algo diferente en mi próximo proyecto, en línea con las recomendaciones de Apple.

Sin embargo, es una cosa extraña que en general se puede encontrar toneladas de recursos en el desarrollo de iOS, pero con esto realmente he tenido problemas para encontrar cualquier información. Es decir, buscar en la arquitectura de red de iOS y crear redes en el modelo, y así sucesivamente. Eso fue hasta que recientemente publiqué una pregunta similar en los foros de desarrollo de Apple. Quinn brindó una respuesta muy útil. Se puede leer aquí: LinkedImageFetcher and Network Code in the Model

Quinn señaló que la mejor muestra para demostrar que esto es MVCNetworking

también, que a pesar de no haber tenido el tiempo para actualizar la muestra con la base de datos, NSURLSession, y así sucesivamente, todavía siente que "la arquitectura básica de MVCNetworking es bastante sólida".

Finalmente, este post también se hace referencia; parece que tiene algunos muy buenos enlaces:

MVCNetworking on iOS 5

0

redes, análisis, ecc ... sin duda ir en la parte Modelo de una aplicación ... Para el modelo me refiero a la parte del patrón MVC no es estrictamente en el objeto de representación modelo.

Voy a pensar en la construcción de una estructura de este modo:

Cuando el controlador pedir algunos datos al modelo, que tiene una dependencia a un tipo de Network Manager, ahora el único modelo de reflexión tiene que hacer es invocar un método en él (especificado en un protocolo) y esperar la respuesta (obviamente asíncrono). El administrador de red tiene una referencia a una clase especificada que se encarga de realizar la llamada a la red y volver a los datos en bruto, cuando un bloque de terminación se dispara el administrador de red da esos datos a un objeto analizador (obviamente con un método especificado en un protocolo), espere la respuesta y cuando los datos sean recuperados y analizados regresen la matriz, el diccionario o lo que necesita al modelo con los nuevos datos actualizados, después de todo esto puede pasar al controlador para hacer un reloadData o algo así entonces, y actualice las vistas con datos actualizados.

espero que sería de gran ayuda.

Cuestiones relacionadas