2010-01-25 10 views
7

De un ejemplo de Apple, tengo unas pocas cosas:¿Puedo crear una nueva instancia de mi clase de objeto administrado personalizado sin pasar por NSEntityDescription?

Event *event = (Event*)[NSEntityDescription 
    insertNewObjectForEntityForName:@"Event" 
      inManagedObjectContext:self.managedObjectContext]; 

Event hereda de NSManagedObject. ¿Hay alguna manera de evitar esta extraña llamada a NSEntityDescription y en su lugar solo alloc+init de alguna manera directamente la clase Event? ¿Tendría que escribir mi propio inicializador que hace esas cosas arriba? ¿O es NSManagedObject lo suficientemente inteligente como para hacer eso?

Respuesta

5

NSManagedObject proporciona un método llamado initWithEntity:insertIntoManagedObjectContext:. Puede usar esto para hacer un par más tradicional de alloc/init. Tenga en cuenta que el objeto que devuelve es no autoreleased.

+0

Oh sí, pero nunca lo anule 'initWithEntity: insertIntoManagedObjectContext:'. 'awakeFromInsert' es el lugar apropiado para hacer la inicialización. – Alex

1

Para que funcione correctamente, hay MUCHAS cosas que hacer. -insertNewObject: ... es, de lejos, la forma más fácil, rara o no. The documentation dice:

Un objeto gestionado se diferencia de otros objetos en tres formas principales -un objeto administrado ... Existe en un ambiente definido por su contexto objeto administrado ... hay por lo tanto una gran cantidad de trabajar que hacer para crear un nuevo objeto gestionado adecuadamente y su integración en la infraestructura de datos Core ... que son disuadidos de anulando initWithEntity: insertIntoManagedObjectContext:

Dicho esto, aún puedes hacerlo (sigue leyendo en la página a la que me he vinculado) pero tu objetivo parece ser "más fácil" o "menos raro". Yo diría que el método que sientes extraño es en realidad la forma más simple y más normal.

1

Encontré una respuesta definitiva de Más desarrollo de iPhone 3 por Dave Mark y Jeff LeMarche.

Si realmente le molesta que utilice un método de NSEntityDescrpiton más que en NSManagedObjectContext para insertar un nuevo objeto en un NSManagedObjectContext, se puede utilizar una categoría añadir un método de instancia a NSManagedObjectContext.

Crear dos nuevos archivos de texto llamados NSManagedObject-Insert.h y NSManagedObject-Insert.m.

En NSManagedObject-Insert.h, coloque el código siguiente:

import <Cocoa/Cocoa.h> 
@interface NSManagedObjectContext (insert) 
- (NSManagedObject *)insertNewEntityWithName:(NSString *)name; 
@end 

En NSManagedObject-Insert.m, colocar este código:

#import "NSManagedObjectContext-insert.h" 

@implementation NSManagedObjectContext (insert) 
- (NSManagedObject *)insertNewEntityWithName:(NSString *)name 
{ 
return [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:self]; 
} 
@end 

Puede importar NSManagedObject -Insert.h en cualquier lugar donde desee utilizar este nuevo método.A continuación, reemplace las llamadas de inserción contra NSEntityDescription, como éste:

NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; 

con el más corto y más intuitivo uno:

[context insertNewEntityWithName:[entity name]]; 

no son categorías de los grandes?

3

Me he encontrado con el mismo problema. Resulta que puedes crear una entidad completamente y no agregarla a la tienda al principio, luego hacer algunos controles sobre ella y si todo está bien insertarla en la tienda. Lo uso durante una sesión de análisis XML en la que solo quiero insertar entidades una vez que se han analizado correctamente y completamente.

primer lugar usted necesita para crear la entidad:

// This line creates the proper description using the managed context and entity name. 
// Note that it uses the managed object context 
NSEntityDescription *ent = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:[self managedContext]]; 

// This line initialized the entity but does not insert it into the managed object context.  
currentEntity = [[Location alloc] initWithEntity:ent insertIntoManagedObjectContext:nil]; 

Luego, una vez que esté satisfecho con el tratamiento sólo tiene que insertar su entidad a la tienda:

[self managedContext] insertObject:currentEntity 

Tenga en cuenta que en esos ejemplos, el El objeto currentEntity se ha definido en un archivo de encabezado de la siguiente manera:

id currentEntity 
Cuestiones relacionadas