Passing ManagedObjectContext para ver controladores usando guiones gráficos con un UITabBarController raíz

Utilizando guiones gráficos no tiene fácil acceso al primer controlador de vista en appDelegate (aunque una vez que lo hagaprepareForSegue hace que sea fácil pasar ManagedObjectContext a la pila de navegación.

Me decidí a dar a cada controlador de vista (o superclase de cada controlador de vista) que requiere acceso a Core Data un miembro moc:

@synthesize moc = _moc;
@property (nonatomic) __weak NSManagedObjectContext *moc;

Estoy inquieto porque no parece una forma muy elegante de hacerlo, demasiado código. Pero asignar directamente requiere especificar índices absolutos en las matrices de viewControllers y cambiar appDelegate cada vez que el requisito de ManagedObjectContexts cambia

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;

    // rootView gets a tab bar controller
    for(UINavigationController *navController in tabBarController.viewControllers) {

        for(UIViewController *viewController in navController.viewControllers) {

            if([viewController respondsToSelector:@selector(setMoc:)]) {
                [viewController performSelector:@selector(setMoc:) withObject:self.managedObjectContext];
                NSLog(@"Passed moc to %@", [viewController description]); 
            }
        }
    }

    return YES;
}

¿Cuáles son las trampas de este enfoque y hay una mejor manera? ¿Es mejor intentar ser más genérico:

- (void)assignManagedObjectContextIfResponds:(UIViewController *)viewController {

    if([viewController respondsToSelector:@selector(setMoc:)]) {
        [viewController performSelector:@selector(setMoc:) withObject:self.managedObjectContext];
        NSLog(@"Passed moc to %@", [viewController description]); 
    }

}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSMutableArray *viewControllers = [NSMutableArray array];

    UIViewController *firstLevelViewController = self.window.rootViewController;

    if([firstLevelViewController respondsToSelector:@selector(viewControllers)]) {

        NSArray *firstLevelViewControllers = [firstLevelViewController performSelector:@selector(viewControllers)];

        for(UIViewController *secondLevelViewController in firstLevelViewControllers) {

            if([secondLevelViewController respondsToSelector:@selector(viewControllers)]) {

                NSArray *secondLevelViewControllers = [secondLevelViewController performSelector:@selector(viewControllers)];

                for(UIViewController *thirdLevelViewController in secondLevelViewControllers) {

                    [viewControllers addObject:thirdLevelViewController];
                }

            } else {
                [viewControllers addObject:secondLevelViewController];
            }
        }
    } else {
        // this is the simple case, just one view controller as root
        [viewControllers addObject:firstLevelViewController];
    }

    // iterate over all the collected top-level view controllers and assign moc to them if they respond
    for(UIViewController *viewController in viewControllers) {
        [self assignManagedObjectContextIfResponds:viewController];
    }

    return YES;
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta