Я согласен с Винке. Нет ничего плохого в доступе к вашему стеку основных данных в application:didFinishLaunchingWithOptions:
, если вы не начинаете обработку данных в рамках этого метода. Вы должны загрузить новый контроллер представления, установить его контекст управляемого объекта и запустить процесс асинхронно после загрузки этого представления.
Из вашего вопроса мне неясно, пытаетесь ли вы получить доступ к контексту управляемого объекта внутри делегата приложения или пытаетесь получить к нему доступ из другого класса. Если вы обращаетесь к нему из другого класса, предлагаемый код создает тесную связь, которая уменьшает возможность повторного использования вашего кода. Лучше было бы установить свойство при создании экземпляра класса.
При кодировании классов контроллера представления убедитесь, что вы настроили синтезированное свойство для контроллера представления:
// CustomViewControllerClass.h
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
// CustomViewControllerClass.m
@synthesize managedObjectContext = __managedObjectContext;
Когда вы загружаете свой контроллер представления в делегат приложения, передайте контекст управляемого объекта делегата приложения в контроллер представления:
// MyAppDelegate.m (inside application:didFinishLaunchingWithOptions:)
CustomViewController *controller = (CustomViewController *)masterNavigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
Таким образом, если у вас есть стек Базовых данных, который не настроен в вашем делегате приложения, ваш пользовательский класс может легко принять контекст управляемого объекта из любого класса, который его создает.