2012-03-12 11 views
8

La declaración estándar para un autogenerado NSManagedObject propiedad declara relaciones a muchos les gusta esto:Conjuntos mutables en NSManagedObjects?

@property (nonatomic, retain) NSSet *somethings; 
... 
@dynamic somethings; 

sería seguro para cambiar esa declaración a un NSMutableSet? ¿El componente CoreData aún funcionaría correctamente?

A juzgar por el @dynamic, se fastidió no le importa si uso una subclase NSSet en lugar de un NSSet, pero no quiero volver a escribir mucho código sólo para descubrir que no funciona.

Respuesta

11

De acuerdo con Core Data Programming Guide de Apple, esto siempre debe declararse como un NSSet.

Si desea un proxy mutable (que es básicamente la versión mutable del conjunto de datos básicos y funciona exactamente de la misma), entonces sería utilizar la función mutableSetValueForKey así:

// myManagedObject is the managed object that has the somethings property. 
NSMutableSet *mutableSomethings = [myManagedObject mutableSetValueForKey:@"somethings"]; 

mutableSomethings continuación, se pueden modificar como un estándar NSMutableSet y somethings se actualizarán y los métodos KVO se llamarán apropiadamente.

Sin embargo, muchas funciones del conjunto mutable (como addSomethingsObject y removeSomethingsObject) ya se incluyen en los accesores generados por datos básicos, por lo que en muchos casos no es necesario utilizar el proxy.

6

debe ser conservado como un NSSet y realice una de las siguientes opciones:

  1. Uso key value coding
  2. Añadir el núcleo data generated accessors

Para la codificación de valores clave, podrás acceder a su colección como ese:

NSMutableSet *somethings = [object mutableSetValueForKey:@"somethings"]; 
[somethings addObject:newObject]; 

Para datos básicos generados descriptores de acceso, deberá añadir lo siguiente a su cabecera:

@interface MyManagedObject (CoreDataGenerated) 
- (void)addSomethingsObject:(MySomething *)object; 
- (void)removeSomethingsObject:(MySomething *)object; 
- (void)addSomethings:(NSSet *)somethings; 
- (void)removeSomethings:(NSSet *)somethings; 
@end 

No es necesario para poner en práctica estos métodos (datos básicos se hará cargo de él para usted), y se puede llamar a ellos fácilmente. Esta es mi forma preferida de manejar colecciones porque obtienes una mejor verificación de tipos del compilador.

La razón por la que no debe cambiarlo a un NSMutableSet es porque hay una buena probabilidad de que cause bloqueos y/o que sus cambios no se conserven en su almacén de datos centrales.

Es posible que también desee consultar mogenerator para ayudarlo a crear todas sus clases de Cocoa.

+0

causará algún problema si agrego el objeto ya presente a la relación – Johnykutty

+2

@Johnykutty establece que no haya duplicados. Esto no debería tener ningún efecto. – wbyoung

Cuestiones relacionadas