Separación de delegates de ViewController para classs propias

Soy bastante nuevo en el desarrollo de iOs y me he vuelto un poco confundido cómo debo separar mi código para evitar un enorme ViewController.m-file. Actualmente, mi principal controller de visión tiene bastantes delegates:

@interface ViewController : UIViewController <MKMapViewDelegate, HttpClientDelegate, CLLocationManagerDelegate, NSFetchedResultsControllerDelegate> 

Me gustaría networkingucir el código viewController y creo que debería crear classs separadas para manejar las tareas de delegado. El problema es que si, por ejemplo, creo una class singleton para CLLocationManager y permito implementar los methods de delegado, ¿cómo me comunico con el controller de vista?

Digamos que mi CLLocationManager recibe una actualización de location, ¿cómo le digo al viewController que realice cambios en la interfaz de usuario? ¿Debería usar NSNotificationCenter para publicar una notificación y luego agregar un observador al controller de vista? ¿O es la mejor manera de permitir que viewController implemente todos los methods delegates como ahora?

Mueva parte de esa funcionalidad a su model de datos.

Es difícil decir cómo debe administrar esto dada la información limitada que ha proporcionado, pero uno debe preguntarse si un controller de vista única realmente debería gestionar una vista de map y hacer un seguimiento de la location y administrar una connection HTTP y administrar un Core Data ha podido recuperar. ¿Por qué no mover algo de eso a su model, donde será más fácil dividirlo en modules?

Digamos que mi CLLocationManager recibe una actualización de location, ¿cómo le digo al viewController que realice cambios en la interfaz de usuario? ¿Debería usar NSNotificationCenter para publicar una notificación y luego agregar un observador al controller de vista?

Una notificación sería una buena solución; proporciona una forma para que la parte de su progtwig que administra la location (nuevamente, esto probablemente pertenezca al model) comunique el cambio sin tener que saber nada en particular sobre las partes del progtwig que Se preocupan por los cambios en la location. También permite la comunicación de uno a varios: si tiene otro controller de vista que también se preocupa por la location, puede observar la misma notificación.

¿O es la mejor manera de permitir que viewController implemente todos los methods delegates como ahora?

Trato de pensar en dividir las responsabilidades de manera adecuada más que limitando el tamaño del código. Si tiene una class que hace un trabajo pero necesita mucho código para hacerlo, está bien. Si tienes una class que maneja muchas cosas no relacionadas, eso no es tan bueno. El problema es que muchos trabajos parecen estar dentro del papel tradicional de "gestionar una pantalla de contenido" de un controller de vista. Intente separar la tarea de administrar la presentación de los datos (que es el trabajo legítimo del controller de vista) de administrar los datos en sí (que es el trabajo del model).

Implementar una class responsable de los methods de delegado:

 @interface DelegateManager : NSObject <MKMapViewDelegate, HttpClientDelegate, CLLocationManagerDelegate, NSFetchedResultsControllerDelegate> -(id)initWithViewController:(ViewController*)vc; @property (weak) ViewController *delegate; @end 

En su ViewController:

 @interface ViewController : UIViewController -(void)doSomething; @end 

En su ViewController, cree una instancia de DelegateManager con su propio parámetro. Establezca el objective de todos los delegates en su DelegateManager. En los methods delegates de su DelegateManager, llame [self.delegate doSomething]; para comunicarte con tu ViewController.