2012-08-02 18 views
5

Sto cercando di creare un contesto dell'oggetto gestito temporaneo e, dopo alcune schermate dell'utente che inseriscono informazioni, unisco quel contesto con il contesto principale (per garantire che non ci siano "incomplete") gli oggetti sono inseriti). Questo è il modo Creo il mio contesto temporanea e come inserire un oggetto in esso:La proprietà managedObjectContext di NSManagedObject è nil

if (!self.someManagedObject) { 

    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:@[[NSBundle mainBundle]]]; 
    NSPersistentStoreCoordinator *storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; 
    [storeCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:nil]; 

    NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] init]; 
    [managedObjectContext setPersistentStoreCoordinator:storeCoordinator]; 

    self.someManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"SomeObject" inManagedObjectContext:managedObjectContext]; 
    NSLog(@"%@", self.someManagedObject.managedObjectContext); 
} 

Questa è una parte di viewDidLoad. Nella console mostra che il contesto dell'oggetto gestito ha un valore.

Tuttavia, subito dopo l'istruzione if (anche all'interno viewDidLoad, self.someManagedObject.managedObjectContext è nulla. Posso capire perché la variabile locale non sarebbe più disponibile (si va semplicemente fuori del campo di applicazione), ma la proprietà dell'oggetto gestito dovrebbe essere ancora essere impostato , giusto?

so di poter creare una proprietà per memorizzare il contesto oggetto gestito, ma preferirei farlo funzionare in questo modo.

+0

è 'someObject' uguale a' someManagedObject'? – aforaudrey

+0

Oops, sì. Prima ho messo 'someObject', ma poi volevo chiarire che si tratta di un oggetto NSManagedObject. –

+0

Hai controllato che 'self.someManagedObject' è non-zero? Supponendo che 'insertNewObject ...' non sia riuscito o la tua proprietà sia peculiare, questo spiegherebbe cosa stai vedendo. – Tommy

risposta

15

recente ho incontrato lo stesso problema di nuovo, anche se era in un diverso situazione. Avevo bisogno di un contesto di oggetti gestito temporaneo, completamente separato da quello principale, ma mi sono imbattuto di nuovo nel problema che scompare dopo che è andato fuori portata. Questa volta ho deciso di indagare ulteriormente e alla fine ho realizzato che managedObjectContext non è una proprietà di NSManagedObject, ma un metodo. Ciò significa che una delle due cose:

  1. Se si utilizza una proprietà nell'implementazione sottostante, tale proprietà will not hold a strong reference al contesto
  2. Se il contesto oggetto gestito deriva in qualche altro modo, sarà anche non mantiene la forte riferimento a tale contesto.

In entrambi i casi, il contesto non ha riferimenti forti, va fuori portata, e le NSManagedObject s avere un nilmanagedObjectContext.

La soluzione era semplicemente mantenere il contesto creando una proprietà forte per esso.

+0

Sai perché questo è il caso? (Ho una SO [domanda] separata (http://stackoverflow.com/q/23687160/1108362) per quello ...) – jsadler

-2

non vedo il motivo per cui si avrebbe bisogno di un secondo contesto oggetto gestito IMHO, stai introducendo la complessità nella tua app che non serve a nessuno scopo particolare

Inserire il nuovo oggetto nel contesto principale. Consenti all'utente di inserire i suoi dati. Se egli si rompe, è sufficiente chiamare

[managedObjectContext rollback]; 

o, se le finiture utente e tutti i dati vengono convalidati, chiamare

[managedObjectContext save:nil]; 
+0

Anche questa sembra una buona soluzione, ma quanto tempo fa "rollback"? All'ultimo salvataggio? Mi piace affidarmi al salvataggio automatico, quindi dovrei inserire manualmente le chiamate su "save" (che non è un problema, ma dovrei sapere). –

+0

Ultimo salvataggio: può essere un po 'più complicato di così, ma solo in situazioni speciali. - Inoltre, non ero a conoscenza del "salvataggio automatico". Certamente meglio farlo esplicitamente. – Mundi

+0

Ho un problema nel farlo in questo modo: devo verificare tutti i possibili modi in cui l'utente potrebbe evitare di compilare tutte le informazioni. Invece di controllare se l'utente ha fatto qualcosa di "sbagliato" (come in, il processo è stato interrotto), voglio essere in grado di salvare quando il processo è stato completato. Per processo intendo "passare attraverso le schermate in cui l'utente inserisce le informazioni". Non voglio dover richiamare il 'rollback' per ogni possibile interruzione. –

Problemi correlati