2012-03-12 13 views
8

La dichiarazione standard per un NSManagedObject proprietà generato automaticamente dichiara rapporti a-molti come questo:Set mutabili in NSManagedObjects?

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

sarebbe sicuro di cambiare tale dichiarazione a un NSMutableSet? Il componente CoreData funzionerebbe ancora correttamente?

A giudicare dal @dynamic, si probaby non si preoccupa se uso un NSSet sottoclasse piuttosto che un NSSet, ma non voglio riscrivere un sacco di codice solo per scoprire che non funziona.

risposta

11

Secondo Apple Core Data Programming Guide, questo deve sempre essere dichiarato come NSSet.

Se si desidera un proxy mutabile (che è sostanzialmente la versione mutabile del set di dati di base e funziona esattamente la stessa cosa), allora si può usare la funzione mutableSetValueForKey in questo modo:

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

mutableSomethings possono poi essere modificati come standard NSMutableSet e somethings verranno aggiornati e i metodi KVO verranno chiamati in modo appropriato.

Nota tuttavia, che molte caratteristiche del set mutabile (come addSomethingsObject e removeSomethingsObject) sono già previsti nei dati fondamentali di accesso generato così in molti casi non è necessario per utilizzare il proxy.

6

Si dovrebbe tenere come un NSSet ed eseguire una delle seguenti operazioni:

  1. Usa key value coding
  2. Aggiungere il nucleo data generated accessors

Per la codifica valore chiave, potrai accedere alla collezione così:

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

Per dati fondamentali di accesso generati, dovreste aggiungere quanto segue al intestazione:

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

Non è necessario implementare questi metodi (Core Data si prenderà cura di esso per voi), e si può chiamare facilmente. Questo è il mio modo preferito di gestire le raccolte perché si ottiene un migliore controllo dei tipi dal compilatore.

Il motivo per cui non è necessario cambiarlo in un NSMutableSet è perché ci sono buone probabilità che si verifichino arresti anomali e/o che le modifiche non vengano mantenute nell'archivio dei dati principali.

Si potrebbe anche voler esaminare mogenerator per aiutarti a creare tutte le tue lezioni di cacao.

+0

causerà problemi se aggiungo l'oggetto già presente alla relazione – Johnykutty

+2

@Johnykutty set assicurano che non ci siano duplicati. Questo non dovrebbe avere alcun effetto. – wbyoung

Problemi correlati