Estoy seguro de que cada nuevo desarrollador de iOS tiene el siguiente problema: los controladores de vista se llenan muy rápido de código para diversos fines, llegando fácilmente a más de 500 líneas de código.
Así es como se ve para dos pantallas básicas y comunes:
1) La pantalla del formulario:
2) La pantalla del controlador de vista de tabla
Hasta ahora he leído sobre dos soluciones diferentes:
Primera solución: https://bendyworks.com/single-responILITY-principle-ios/ . Esto se basa en notificaciones, separa completamente el controlador de vista del modelo de vista (intenciones) y, por lo tanto, reduce el código en el controlador de vista. Creo que tiene la desventaja de romper el código, similar a las estructuras Go-To. Se parece a esto:
La segunda solución mantiene los mismos controladores de vista abarrotados (las acciones de los botones se ejecutan dentro de VC, etc.). pero usa bibliotecas como TPKeyboardAvoiding , BlocksKit u otras soluciones, la mayoría de ellas basadas en categorías. Con esta segunda solución, el código se reduce drásticamente, pero el controlador de vista aún tiene mucha responsabilidad.
¿Qué opinas de estas soluciones? ¿Cual es mejor? Hay alguno mejor?
fuente
Respuestas:
Podemos usar MVVM para resolver este problema.
Model-View-ViewModel, o patrón MVVM como se le conoce comúnmente, es un patrón de diseño de interfaz de usuario. VM toma toda la lógica sobre la preparación de datos del modelo para la interfaz de usuario desde VC.
Ejemplo:
tiene un objeto modelo con algunos campos, desea formatear algunos de ellos, hacer cálculos y combinarlos.
En el caso de MVC, toda esa lógica se encuentra en ViewController.
En MVVM lo mueve todo de VC a VM.
VM preparará todos los datos para UI y VC simplemente lo configura de esta manera.
(en clase VC)
Tutoriales y temas:
fuente
He tenido que desenredar código en controladores de vista de gran tamaño antes y realmente impidió mi capacidad de navegar por el contenido al principio. Una cosa importante que me di cuenta es que el tamaño solo del controlador de vista no era razón suficiente para separar las cosas. Hay complejidad en tener 1 archivo grande y también complejidad en tener un montón de archivos pequeños. Aquí hay algunas razones válidas para refactorizar para dividir un controlador de vista en partes más pequeñas:
MVC
El controlador de vista no debería hacer mucho más que ser el pegamento de conexión entre la vista y el modelo. Si tiene mucho código de conexión de red, código de manipulación de imágenes, etc., considere dividirlos en clases auxiliares.
Múltiples controles con el controlador de vista como fuente de datos
Si tiene un montón de controles en pantalla que tienen su controlador de vista como fuente de datos, considere dividirlos en objetos de fuente de datos separados y haga que sean la fuente de datos. O también puede dividirlos en Controladores de vista separados (como si el Controlador de vista tiene una vista de tabla además de otro controlador, puede dividirlo en su propia clase Controlador de vista de tabla).
Código duplicado
Si tiene exactamente el mismo código en diferentes controladores de vista, colóquelo en 1 ubicación compartida. Eso hará que su código sea reutilizable y ayudará a administrar la complejidad.
Aquí hay algunos consejos adicionales para minimizar la complejidad de View Controller:
Storyboard en lugar de programático
Crear elementos de vista es mucho código y el código de geometría de marco también es mucho trabajo. De lo contrario, considere usar restricciones de diseño automático y colocar la mayor cantidad posible de elementos de vista en el guión gráfico.
Código / comentarios innecesarios
También asegúrese de eliminar códigos / comentarios innecesarios. Muchas veces un nuevo archivo de View Controller vendrá con métodos que no está utilizando. Si no está utilizando un método como
didReceiveMemoryWarning
este, es seguro sacarlo. Además, debido a que el archivo del controlador de vista es tan grande, a veces da miedo eliminar el código o los comentarios antiguos. ¡No dejes eso! Solo se suma a la complejidad.Notificaciones
Para responder a su pregunta sobre notificaciones: las notificaciones no son un Golden Hammer para usar con todo. Considero que las notificaciones son útiles cuando varios controladores de vista necesitan actualizarse al mismo tiempo debido a una acción en particular. Sin embargo, tenga cuidado con las notificaciones, usarlas en exceso puede causarle mucho dolor al tratar de localizarlas.
fuente
Hay una arquitectura especial que llaman VIPER (Ver, Interactor, Presentador, Entidad y Enrutamiento). Intentaré resumir aquí lo que necesitas saber:
Ver
Presentador
Enrutamiento
Entonces, lo que creo que limpiarás en tu código:
las validaciones de datos se moverán a la capa Presentador ;
la navegación se moverá a los objetos Wireframe ( capa de enrutamiento );
divida su controlador de vista observando el principio DRY ;
Las pantallas complejas tendrán dos o más Vistas y Presentadores.
Debería ver el siguiente enlace sobre la arquitectura VIPER http://mutualmobile.github.io/blog/2013/12/04/viper-introduction/
¡Buena suerte!
fuente