2010-09-21 13 views
8

Osservo le guide di Core Data e ci sono due modi per ottenere una nuova istanza NSManagedObject.Informazioni su come ottenere un nuovo oggetto NSManagedObject

  • - initWithEntity: insertIntoManagedObjectContext: di classe NSManagedObject
  • + insertnewObjectForEntityForName: inManagedObjectContext: di classe NSEntityDescription

ci sono delle differenze tra i due metodi? Oppure, intendono solo la stessa cosa per ottenere un nuovo NSManagedObject in qualsiasi condizione.

risposta

7

In base a ciò che viene detto sulla documentazione, utilizzando il metodo di classe da NSEntityDescription per creare un'istanza di NSManagedObject è possibile farlo senza dichiarare/importare la relativa intestazione. Impostando il nome della classe si otterrà una "istanza completamente configurata" dell'oggetto.

È utile nelle prime fasi di sviluppo quando le cose cambiano costantemente ma può essere un fattore di rischio poiché non si ottengono errori di compilazione o avvisi se si scrive male il nome della classe, poiché si tratta di una stringa.

Il metodo da NSManagedObject richiede che l'interfaccia della classe specifica venga importata nel file e rendendola più affidabile rispetto agli errori, in quanto il compilatore può controllare se tale classe esiste.

Ad esempio, avranno lo stesso risultato, restituiranno un'istanza della classe specificata. Anche se i conteggi mantenere saranno diverse:

- initWithEntity:insertIntoManagedObjectContext: (mantenere count == +1)

+ insertnewObjectForEntityForName:inManagedObjectContext: (mantenere count == 0)

Qui è la documentazione

NSEntityDescription Class Reference (insertNewObjectForEntityForName:inManagedObjectContext:)

Return Value

Una nuova istanza completamente autorizzata della classe per l'entità denominata entityName. L'istanza ha la sua descrizione di entità impostata e inserita nel contesto.

Discussione

Questo metodo rende facile per voi per creare istanze di una data entità senza preoccuparsi dei dettagli di creazione oggetto gestito.

Il metodo è particolarmente utile su Mac OS X v10.4, poiché è possibile utilizzarlo per creare un nuovo oggetto gestito senza dover conoscere la classe utilizzata per rappresentare l'entità. Ciò è particolarmente utile all'inizio del ciclo di vita dello sviluppo quando le classi e i nomi delle classi sono volatili.

Su Mac OS X v10.5 e versioni successive e su iOS, è invece possibile utilizzare initWithEntity: insertIntoManagedObjectContext: che restituisce un'istanza della classe appropriata per l'entità.

NSManagedObject Class Reference (initWithEntity:insertIntoManagedObjectContext:)

Return Value

Un inizializzata un'istanza della classe appropriata per l'entità.

discussione

NSManagedObject utilizza la generazione di classe dinamica per sostenere l'Objective-C 2 immobili dispongono (vedi “Proprietà dichiarata”) creando automaticamente una sottoclasse della classe appropriata per entity.initWithEntity: insertIntoManagedObjectContext: quindi i rendimenti un'istanza della classe appropriata per l'entità. La sottoclasse generata dinamicamente sarà basata sulla classe specificata dall'entità, pertanto la specifica di una classe personalizzata nel modello sostituirà la classe passata all'assegnazione.

Se il contesto non è nullo, questo metodo richiama [context insertObject: self] (che causa l'attivazione di awakeFromInsert).

Si sconsiglia di ignorare questo metodo, si dovrebbe invece eseguire l'override di awakeFromInsert e/o awakeFromFetch (se esiste una logica comune a questi metodi, dovrebbe essere preso in considerazione in un terzo metodo invocato da entrambi). Se si esegue l'inizializzazione personalizzata con questo metodo, si potrebbero causare problemi con le operazioni di annullamento e ripetizione.

In molte applicazioni, non è necessario assegnare successivamente un oggetto gestito appena creato a un particolare archivio, vedere assignObject: toPersistentStore :. Se la tua applicazione ha più negozi e hai bisogno di assegnare un oggetto a un negozio specifico, non dovresti farlo nel metodo di inizializzazione di un oggetto gestito. Tale compito è il controller, non la logica a livello di modello.

+0

Grazie mille. – AechoLiu

Problemi correlati