2009-12-02 25 views
7

estoy inicializar una subclase NSManagedObject usando:subclases NSManagedObject y setValuesForKeysWithDictionary:

- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues 

estoy también con conocimiento dándole las llaves no definidos, que por supuesto debe una excepción.

Por lo tanto, he implementado:

- (void)setValue:(id)value forUndefinedKey:(NSString *)key 

Si una clave no está definido, que asignarlo a la tecla correcta.

Sin embargo, mi implementación nunca se llama, en su lugar se usa la implementación de NSManagedObject, que a su vez aún arroja una excepción.

¿Hay algún comportamiento (o error) que impida que setValuesForKeysWithDictionary: use la implementación de la subclase NSManagedObject de setValue:forUndefinedKey:?

Adición de código a lo solicitado, pero ya que sólo estoy poniendo en práctica un método existente, que no se consiga llamar, no sé cuánta ayuda será:

En el contexto:

- (Company*)companyWithDictionary:(NSDictionary*)values{ 

    Company* newCompany = (Company*)[NSEntityDescription insertNewObjectForEntityForName:@"Company" inManagedObjectContext:self]; 

    [newCompany setValuesForKeysWithDictionary:values]; 

    return newCompany; 
} 

En el Company subclase (nunca llamada):

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{ 

    if([key isEqualToString:idKey]){ 

     [self setValue:value forKey:@"uniqueID"]; 

    }else if([key isEqualToString:descriptionKey]){ 

     [self setValue:value forKey:@"descriptionText"]; 

    }else if([key isEqualToString:timeUpdatedKey]){ 

     [self setValue:value forKey:@"dateUpdated"]; 

    }else{ 

     [super setValue:value forUndefinedKey:key]; 

    } 
} 

Respuesta

3

definitivamente hay nada intrínseco a NSManagedObject que impide que esta; Estoy haciendo exactamente esto en la aplicación en la que estoy trabajando. ¿Puedes publicar más de tu código?

Una idea, también: ¿está seguro de que es setValue:forUndefinedKey: que está arrojando la excepción? Para un objeto administrado, estoy bastante seguro de que también necesita implementar valueForUndefinedKey: (el getter) para que todo funcione correctamente.

+0

Sí, lo veo en el rastro de la pila. Y también es definitivamente la implementación de NSManagedObject. –

+0

No he implementado valueForUndefinedKey :. Intentaré eso, pero no veo por qué eso a través del setter fuera de control. –

+0

Agregué un código ... –

2

Pregunta simple, pero ¿está especificando el nombre de clase de la subclase NSManagedObject para la entidad en su modelo?

Además, dijiste que estás inicializando el objeto gestionado ... ¿cómo? Debería insertarlo a través de + [NSEntityDescription insertNewObjectForEntityForName: inManagedObjectContext:] en la mayoría de los casos, a menos que tenga una buena razón para no hacerlo.

+0

Sí y Sí. También recreé mis clases modelo para estar seguro. También traté de implementar valueFOrUndefinedKey en la clase de modelo Y como una categoría. –

+0

Eso es realmente extraño. ¿Puedes reproducir esto en un caso de prueba reducido? He hecho cosas similares, pero nunca me encontré con este problema. –

1

Un volcado de clase rápido del marco CoreData indica que NSManagedObject también reemplaza setValuesForKeysWithDictionary:, por lo que parece que definitivamente se está haciendo cierta personalización para ese método, quizás por razones de rendimiento o algo así. Probablemente solo escriba mi propio método equivalente al setValuesForKeysWithDictionary: y lo llame para evitar el desastre. Algo como esto:

- (void)mySetValuesForKeysWithDictionary:(NSDictionary*)dict 
{ 
    for (NSString* key in dict) 
     [self setValue:[dict objectForKey:key] forKey:key]; 
} 
+0

eso es esencialmente lo que hice, pero teniendo en cuenta los valores de NSNull. Incluso después de implementar la solución de Sixten, hubo otro error extraño, así que tiré la toalla. –

Cuestiones relacionadas