2008-09-24 31 views
11

La documentation on -setPrimitiveValue:forKey: de Apple es vaga de dos maneras cuando se usa para gestionar muchas relaciones.setPrimitiveValue: ForKey: y para muchas relaciones

Primera Afirman:

Si se intenta establecer una relación de muchos a un nuevo objeto NSMutableSet, será (con el tiempo) fallará.

Eventually ?! ¿Qué significa eso? ¿Fallará más tarde durante el -[NSManagedObjectContext save:]? Cuando un objeto administrado se convierte en un error y luego se vuelve a ubicar? ¿Cuando? ¿Puedo escribir un caso de prueba para recrear de manera consistente el error a pedido?

En segundo lugar, proporciona código de ejemplo para manejar correctamente este caso, escriben:

primero obtener el conjunto existente usando primitiveValueForKey: (garantizar el método no devuelve nil)

¿Qué debo hacer si/cuando el método hace ¿devuelve nil? assert() y fallar de inmediato porque eso significa que todo el gráfico del objeto está dañado y el ahorro dará lugar a la pérdida de datos? NSAssert() en él como una advertencia para la persona que llama pero sigue presionando (silenciosamente sin hacer nada)?

En este momento estoy simplemente asignar directamente a mi deseada NS[Mutable]Set en ese caso, así:

- (void)setChildren:(NSSet*)value_ { 
    NSMutableSet *mutableRelationshipSet = [[[self primitiveValueForKey:@"children"] mutableCopy] autorelease]; 
    if (mutableRelationshipSet) { 
     [mutableRelationshipSet setSet:value_]; 
     [self setPrimitiveValue:mutableRelationshipSet forKey:@"children"]; 
    } else { 
     [self setPrimitiveValue:value_ forKey:@"children"]; 
    } 
} 

¿Eso es malo?

Respuesta

6

Simplemente cambie el valor de retorno de -primitiveValueForKey: como un conjunto mutable, confiando en que su valor de retorno hará lo correcto.

Asegúrese de utilizar también -willChangeValueForKey:withSetMutation:usingObjects: y -didChangeValueForKey:withSetMutation:usingObjects: alrededor de su manipulación; usted no mostró esto en su código anterior.

- (void)setChildren:(NSSet *)value { 
    [self willChangeValueForKey:@"children" withSetMutation:NSKeyValueSetSetMutation usingObjects:value]; 

    NSMutableSet *primitiveValue = [self primitiveValueForKey:@"children"]; 

    [primitiveValue setSet:value]; 

    [self didChangeValueForKey:@"children" withSetMutation:NSKeyValueSetSetMutation usingObjects:value]; 
} 

Si puede apuntar a Leopard, no tiene que preocuparse por esto; se puede usar de base de datos de soporte incorporado propiedad en lugar:

#import <CoreData/CoreData.h> 

@interface Folder : NSManagedObject 
@property (readwrite, retain) NSSet *children; 
@end 

@implementation Folder 
@dynamic children; 
@end 

datos básicos generará no sólo un par de captador/definidor de la propiedad children pero los descriptores de acceso mutable-establecidos, así, por lo que puede utilizar -mutableSetValueForKey: en él y manipule el resultado con un mínimo de sobrecarga.

Cuestiones relacionadas