Передача базовых данных в класс View Controller
У меня есть мозговой класс, в котором я хочу получить службы Rest и поместить информацию в базовые данные (я посмотрел на сопоставление объектов RestKit, но пока не до конца понимаю и хочу упростить его). Я хочу, чтобы базовые данные были в моем engine
класс, но чтобы покрыть мои основы, я добавляю ManagedObjectContext ко всем VC в контроллере панели вкладок, вот так (в делегате приложения):
UITabBarController *tabBar = (UITabBarController *)self.window.rootViewController;
NSArray *viewControllers = [tabBar viewControllers];
NSManagedObjectContext *context = self.managedObjectContext;
self.engine.managedObjectContext = context;
for (id viewController in viewControllers) {
[viewController setManagedObjectContext:context];
}
tabBar.selectedIndex = 2;
return YES;
Тем не менее, я получаю эту ошибку в журнале, когда я пытаюсь проверить, доступны ли coreData в моем engine
учебный класс:
if (self.managedObjectContext == NULL || [self.managedObjectContext isEqual:[NSNull null]]) {
NSLog(@"Error");
}
Что я делаю неправильно? Как правильно передать данные Core классу non-viewController?
РЕДАКТИРОВАТЬ: прямо перед оператором IF, это в отладчике:
(lldb) po self.managedObjectContext
(NSManagedObjectContext *) $1 = 0x00000000 <nil>
(lldb)
1 ответ
Если предположить, что свойство context на всех других контроллерах представления является сильным, то ответ таков: когда вы собираетесь назначить его, оно еще не было создано. Попробуй это:
NSManagedObjectContext *context = self.managedObjectContext;
assert(context); // or NSLog context
self.engine.managedObjectContext = context;
Обратите внимание, что все пользователи контекста должны быть в одном потоке (я предполагаю, что основной поток в нашем коде).
Тем не менее, лучшим решением было бы для класса, который управляет контекстом, "продавать" словари или массивы заинтересованным сторонам и хранить весь доступ к контексту в одном файле (или классе). Это сделает будущий отладчик намного проще (ИМХО)>
РЕДАКТИРОВАТЬ: Если проблема заключается в том, что значение установлено в исходном коде, который вы опубликовали - я предполагаю, что это ваш appDelegate, а managedObjectContext является сильным свойством, затем запишите операцию set:
for (id viewController in viewControllers) {
[viewController setManagedObjectContext:context];
NSLog(@"Just set context=%@ in %@", viewController, [viewController managedObjectContext]);
}
Теперь в каждом из ваших viewControllers в viewDidLoad добавьте строку:
NSLog(@"ViewController %@ context=%@", self, self.managedObjectContext);
Вы найдете один из них, чтобы быть правдой:
1) вы просто устанавливаете moc на три viewController, но где-то еще вы устанавливаете viewController и не устанавливаете moc (какой-то другой код)
2) viewControllers равен нулю, когда вы идете, чтобы установить MOC на них (логическая ошибка)
3) ViewControllers, на которых вы устанавливаете MOC, и те, которые записывают сообщение, которое я предложил, одинаковы, но MOC равен нулю, когда VC печатает сообщение журнала. В этом случае что-то в VC сбрасывает MOC в ноль - возможно, в viewDidLoad.