Como configurar automaticamente o relacionamento Core Data ao usar contextos aninhados

Eu estou lutando para descobrir uma solução decente para um problema que surge ao usar contextos de objetos gerenciados aninhados em dados principais. Pegue um modelo que tenha dois enites, Person e Name, em que cada pessoa tenha um relacionamento um-para-um com um nome, e o relacionamento pessoal do nome não seja opcional. Anteriormente, em Person's-awakeFromInsert método, eu criaria automaticamente uma entidade de nome para a nova pessoa:

- (void)awakeFromInsert
{
    [super awakeFromInsert];

    NSManagedObjectContext *context = [self managedObjectContext];
    self.name = [NSEntityDescription insertNewObjectForEntityForName:@"Name" inManagedObjectContext:context];
}

Isso funciona muito bem em um contexto de objeto gerenciado único e não aninhado. No entanto, se o contexto tiver um contexto pai, quando o contexto filho for salvo, um novo objeto Person será criado no contexto pai e-awakeFromInsert é chamado novamente neste novo objetoantes as propriedades e relações da Pessoa original são copiadas. Assim, outro objeto Name é criado e, em seguida, "desconectado" quando o relacionamento de nome existente é copiado. O save falha porque a validação do Nome flutuante é agora nuloperson relacionamento falha. Este problema é descritoAqui bem como em outros lugares.

Até agora, não consegui encontrar uma boa solução para esse problema. Preguiçosamente, criar o relacionamento no método getter na verdade causa o mesmo problema, porque o getter é chamado pela maquinaria interna de Core Data quando a nova Person é criada no contexto pai.

A única coisa que posso fazer é abandonar a geração automática de relacionamento e sempre criar o relacionamento explicitamente na classe controladora que cria a Pessoa, ou em um método de conveniência (por ex.+[Person insertNewPersonInManagedObjectContext:]) que é chamado apenas pelo meu código e ésempre o método usado para criar um novo objeto Person explicitamente. Talvez esta seja a melhor solução, mas eu prefiro não ter que ser tão rigoroso sobre permitir que apenas um único método seja usado para criar objetos gerenciados, quando outros métodos de criação sobre os quais não tenho controle e cujo uso eu não posso verifique facilmente para / exclui, existe. Por um lado, isso significará várias subclasses de NSArrayController para personalizar a maneira como criam objetos gerenciados.

Alguém mais que tenha encontrado este problema vem com uma solução elegante que permite que um NSManagedObject para criar um objeto de relacionamento automaticamente após a criação / inserção?

questionAnswers(2)

yourAnswerToTheQuestion