Ваш случай очень прост и поэтому не нуждается в МОК (Инверсия Управления) контейнер как Spring. С другой стороны, когда Вы "программа к интерфейсам, не реализации" (который является хорошей практикой в ООП), у Вас может быть код как это:
IService myService;
// ...
public void doSomething() {
myService.fetchData();
}
(отмечают, что тип myService является IService - интерфейс, не конкретная реализация). Теперь может быть удобно позволить Вашему контейнеру МОК автоматически обеспечить корректный конкретный экземпляр IService во время инициализации - когда у Вас есть много интерфейсов и много реализаций, это может быть громоздким, чтобы сделать это вручную. Основные преимущества контейнера МОК (платформа внедрения зависимости):
Хорошо.
Размещение следующего кода внутри viewDidLoad RootViewController устраняет ошибку:
if (managedObjectContext == nil)
{
managedObjectContext = [(CoreDataBooksAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSLog(@"After managedObjectContext: %@", managedObjectContext);
}
Я нашел человека с похожей проблемой здесь, на SO: текст ссылки
Как отметил Арье в этом посте: «Короче говоря, вы пытаетесь получить сущность из objectContext, который еще не был настроен. Таким образом, вы можете настроить его прямо сейчас или сделать в другом месте приложения до загрузки этого представления. . "
Вы вообще меняли модель Core Data? Эта ошибка часто встречается, когда модель Core Data для приложения изменяется без изменения базовой базы данных SQLite, поэтому сохраненные данные и модель не синхронизированы.
Попробуйте полностью удалить приложение из симулятора или тестового устройства, затем переустановите его и повторите попытку.
В applicationDidFinishLaunching: вы делаете следующее:
rootViewController.managedObjectContext = self.managedObjectContext;
Но я не вижу кода, в котором настраивается self.managedObjectContext. applicationDidFinishLaunching вызывается довольно рано. Вы уверены, что настроили контекст управляемого объекта?