Я изо всех сил пытаюсь найти достойное решение проблемы, возникающей при использовании вложенных контекстов управляемых объектов в основных данных. Возьмите модель с двумя именами: "Лицо и имя", где каждый человек имеет отношения "один к одному" с именем "Имя", а "Имя" не является обязательным. Раньше в методе Person -awakeFromInsert
я автоматически создавал бы объект Name для нового Person:
- (void)awakeFromInsert
{
[super awakeFromInsert];
NSManagedObjectContext *context = [self managedObjectContext];
self.name = [NSEntityDescription insertNewObjectForEntityForName:@"Name" inManagedObjectContext:context];
}
Это отлично работает в одном, не вложенном контексте управляемых объектов. Однако, если контекст имеет родительский контекст, когда дочерний контекст сохраняется, в родительском контексте создается новый объект Person, а -awakeFromInsert
вызывается снова на этом новом объекте до того, как будут скопированы исходные свойства и отношения Person. Итак, создается другой объект Name, затем "отключается", когда копируется существующее отношение имен. Сохранение не выполняется, потому что проверка отношения плавающего имени now-nil person
не выполняется. Эта проблема описывается здесь, а также в других местах.
До сих пор я не смог найти хорошее решение этой проблемы. Ленько создавая отношения в методе геттера, фактически вызывает ту же проблему, потому что получатель вызывается внутренними механизмами Core Data, когда новый Person создается в родительском контексте.
Единственное, что я могу придумать, это отказаться от автоматического создания отношений и всегда создавать отношения явно либо в классе контроллера, который создает Person, либо в методе удобства (например, +[Person insertNewPersonInManagedObjectContext:]
), который вызывается только мой код и всегда является методом, который используется для создания нового объекта Person явно. Возможно, это лучшее решение, но я бы предпочел не быть настолько строгим, чтобы только один метод мог использоваться для создания управляемых объектов, когда другие методы создания, которые я не контролирую, и использование которых я не могу легко проверить/исключить, существуют. Во-первых, это будет означать несколько подклассов NSArrayController для настройки способа создания управляемых объектов.
Кто-нибудь, кто столкнулся с этой проблемой, придумал элегантное решение, позволяющее одному NSManagedObject создавать объект отношений автоматически при создании/вставке?