2013-02-04 19 views
17

Come aggiornare il contesto dell'oggetto gestito da bambino in modo che abbia gli stessi dati con il genitore?Il contenuto del contesto oggetto figlio gestito è sempre uguale al contenuto del suo genitore?

Per quanto ne so, al momento del salvataggio, il bambino fa solo un passo, cioè ai genitori. Tuttavia, quando si recupera, andare sempre molto in profondità fino al genitore e al negozio persistente. Quindi mi aspetto che le cose saranno le stesse.

Eppure non lo è.

Ho un contesto oggetto gestito che è padre di tutti gli altri contesti oggetto gestito.

Un bambino cambia dati e salva. Anche il genitore è cambiato. Eseguo executeFetchRequest su genitore e vedo che i dati cambiano.

Tuttavia, alcuni figli dei genitori utilizzano ancora vecchi dati. Lo stesso oggetto ident gli stessi dati. In qualche modo il valore della proprietà rimane lo stesso.

Come dire al bambino di ricaricare nuovi dati dal genitore?

per essere più esatti

Say P è il genitore

dire che ha C1 C2 C3 come figlio

Poi C1 modificare i dati ei commit. La modifica viene propagata a P. Tuttavia, l'esecuzione di executeFetchRequest in C2 e C3 mostra ancora i vecchi dati.

Cosa dà?

Per esempio, quando posso controllare per la proprietà imageBlob, questo è ciò che ottengo:

bambini:

2013-02-05 13:57:42.865 BadgerNew[78801:c07] imageBlob: <UIImage: 0x89c3c50> 
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null> 
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null> 
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null> 

principale:

2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x114af650> 
2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x8e492e0> 
2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x114c79b0> 
2013-02-05 13:57:42.869 BadgerNew[78801:c07] imageBlob: <UIImage: 0xa8c76e0> 

Ecco una versione più completa perché Annoto il moc, il genitore, il blob, l'URL e l'ID dell'oggetto. Bambino:

In particolare, voglio che il contesto managedobject di mainqueue sia un altro figlio del genitore anziché del genitore di tutti gli altri managedObjectContext. D'altra parte, voglio anche che il contesto dell'oggetto MainQueue Managed abbia informazioni aggiornate. Mi chiedo quale sia la soluzione standard.

+3

Wow Ho messo 50 taglie e ho ottenuto 5 voti quindi, ho ottenuto 10 punti indietro :) –

risposta

21

Il bambino non ha riferimenti esistenti non validi. Se vuoi che i fratelli siano sincronizzati dopo che il genitore è stato salvato, devi invalidare i bambini con reset.

Dopo aver chiamato reset, tutti gli oggetti gestiti del destinatario sono "dimenticati". Se si utilizza questo metodo, è necessario assicurarsi di eliminare anche i riferimenti a tutti gli oggetti gestiti recuperati utilizzando il destinatario, poiché in seguito non saranno più validi.

È inoltre possibile utilizzare refreshObject:mergeChanges: sui singoli oggetti modificati su tutti i contesti figlio durante il salvataggio del contesto genitore se si desidera un controllo più preciso sugli oggetti modificati nei contesti secondari.

+0

Mentre è vero usando il reset è un po 'eccessivo. Sto trovando altra soluzione. –

+0

Ho aggiunto il metodo per aggiornare singoli oggetti gestiti nel contesto. –

+0

Bravo :) L'ho usato in realtà. Goditi la taglia :) E, qualcuno sa perché la domanda è downvoted? –

0

In realtà c'è molta documentazione su come farlo correttamente, compresi i video di sessione WWDC del 2011 e 2012. La sessione 214 2012 "Best practice per i Core Data" sarebbe particolarmente interessante per voi.

Ad esempio, per il salvataggio, dovrebbe assomigliare:

[child performBlock:^{ 
    [child save:&error]; 
    [parent performBlock:^{ 
     [parent save:&parentError]; 
    }]; 
}]; 

che salva il bambino, i cambiamenti vanno al genitore e si salva sul genitore - che propagano tutte quelle modifiche correttamente altri contesti infantili. Guardando la tua domanda, penso che potresti incontrare altri problemi con la tua implementazione e Session 214 potrebbe essere molto utile per risolverli.

Per quanto riguarda il ripristino del contesto, NON consiglio di farlo quando si utilizzano contesti figlio genitore. Vorrei anche evitare di utilizzare refreshObject:mergeChanges:. L'uso di objectWithID per questo scopo potrebbe farti risparmiare molto perché farà il miglior uso della cache di riga del contesto dell'oggetto gestito. Attraverserà anche il più lontano possibile dalla pila di bambini e genitori per soddisfare la richiesta.

+0

Questo è ESATTAMENTE il problema. Ho pensato, cambia il genitore, cambia tutto il bambino. NO. Come ha detto Fruity Geek, la pratica dei dati di base per il ricaricamento dei dati da un genitore è traballante. Quali dati fondamentali fanno, è quello di utilizzare i dati esistenti sul bambino, se esistente. Solo se non esiste o i dati core stantii sembrano più profondi. –

+1

+1 per mostrare che dovrei chiamare [parent performBlock] in [child performBlock] –

+0

Ma la risposta di Fruity Geek è più corretta. Lo sceglierò a meno che non ci sia una risposta migliore, a cui non riesco a pensare. –

Problemi correlati