Mi aspetto (spero anche) che questa sia una domanda stupida, ma dopo aver lottato per molte ore con questo problema ho bisogno di qualche intuizione.Duplicazione dell'entità quando la modifica apportata da un child ManagedObjectContext viene trasferita (salvata) al suo genitore
La mia app iOS 5.1 utilizza MOC annidati, con un MOC figlio PrivateQueueConcurrency, chiamarlo MOC-Child, il cui padre è un MOC MainQueueConcurrency, chiamarlo MOC-Parent. MOC-Parent esegue il backup di una vista tabella che mostra le sue entità.
MOC-Child è utilizzato da un parser, che viene eseguito in modo asincrono su un thread non principale, per creare nuove entità che corrispondono a descrizioni di entità XML analizzate da una connessione URL e quindi inviare le nuove entità al MOC- Genitore, tramite un salvataggio sul MOC-Child, che li visualizza in una vista tabella. Questa grande opera:
1) Parser creates entity in MOC-Child
2) Parser saves MOC-Child
3) New entity is added to MOC-Parent
4) New entity is displayed in MOC-Parent's table view
Tuttavia, la descrizione di un dato soggetto in questo feed può cambiare nel tempo, in modo che l'entità che descrive deve essere modificato in app e la sua cella nella vista tabella aggiornata. Quindi, per ogni descrizione di entità nel feed, il parser tenta di recuperare l'entità (se presente) in MOC-Child che ha lo stesso id dell'entità descritta, e se ne esiste uno confronta i valori dell'entità esistente con i valori di descrizione in vedere se qualcosa è cambiato. Quando il parser rileva in questo modo che un'entità è stata modificata, aggiorna i valori dell'entità esistente in MOC-Child con i nuovi valori nella descrizione, quindi salva MOC-Child per inviare le modifiche a MOC-Parent.
Questo è dove le cose vanno male. Avevo pensato che le modifiche apportate a un'entità recuperata in MOC-Child, quando inviate al genitore salvandolo, semplicemente "appaiono" nella "stessa" entità in MOC-Parent. Tuttavia, quello che vedo accadendo è che l'entità modificata da MOC-Child è aggiunta a MOC-Parent, come se fosse un'entità completamente separata e nuova; con il risultato che MOC-genitore, e quindi la tabella di vista si spinge, finisce con due entità per ogni entità modificato:
1) Parser modifies existing entity in MOC-Child
2) Parser saves MOC-Child
3) Modified entity is _added to_ MOC-Parent
4) Entity is displayed _twice_ in MOC-Parent's table view
Che cosa dà? Cosa devo fare per modificare i valori di un'entità esistente in MOC-Parent, se non riesco a farlo all'interno di MOC-Child? E se dovessi essere in grado di farlo all'interno di MOC-Child, e se avessi altro da fare oltre al salvataggio del MOC-Child per ottenere le modifiche da apportare a MOC-Parent senza aggiungere l'entità una seconda volta?
Grazie in anticipo per qualsiasi aiuto o approfondimento che possiate offrire!
Carl
P.S. Un paio di chiarimenti. Quando dico che l'entità modificata viene aggiunta al MOC-Parent, intendo che NSFetchedResultsController che sta monitorando il MOC-Parent emette un tipo di modifica NSFetchedResultsChangeInsert (non un tipo di modifica NSFetchedResultsChangeUpdate) per l'entità modificata, anche se il " stessa "entità è già presente nel MOC-Parent.
Inoltre, quando dico "stessa" entità, intendo un'entità in MOC-Genitore che ha lo stesso ID fornito dalla descrizione (in questo caso un NSString) come l'entità che viene modificata nel MOC-child (non necessariamente lo stesso objectID, infatti apparentemente ha un oggetto differente).
Ho lo stesso problema. Ho un NSFetchedResultsController collegato a contesti nidificati da un UIManagedDocument. Sto solo caricando da un server sul genitore in background e poi mostrando il bambino dal primo piano. Ma non funziona correttamente, non importa quale. Se chiudo l'app e la riapre, si carica perfettamente dalla memoria. Dispari. –