Передача базовых данных в класс 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.

Другие вопросы по тегам