Spodziewam się (mam nadzieję, że), że to będzie głupie pytanie, ale po tym, jak przez wiele godzin borykam się z tym problemem, potrzebuję trochę wglądu.Powielanie encji, gdy zmiana dokonana przez dziecko ManagedObjectContext jest popychana (zapisywana) do rodzica
Moja aplikacja iOS 5.1 korzysta z zagnieżdżonych MOC-ów, posiadających MOC-dziecko z PrivateQueueConcurrency, nazywa je MOC-Child, którego rodzicem jest MainQueueConcurrency MOC, nazwij go MOC-Parent. MOC-Parent popiera widok tabeli, który wyświetla jego encje.
MOC-Child jest używany przez analizator składni, który działa asynchronicznie w wątku innym niż główny, w celu utworzenia nowych encji odpowiadających opisom encji XML przeanalizowanych z połączenia URL, a następnie przekazania nowych elementów do MOC-a Rodzic, poprzez zapis na MOC-Child, który wyświetla je w widoku tabeli. Działa to doskonale:
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
Jednak opis danego podmiotu w tej paszy może zmieniać się w czasie, tak aby jednostka opisuje musi być modyfikowany w aplikacji, a jego komórka w widoku tabeli zaktualizowane. Tak więc dla każdego opisu obiektu w kanale, parser próbuje pobrać encję (jeśli jest) w MOC-Child, która ma ten sam identyfikator, co opisana encja, i jeśli istnieje jedna porównuje wartości istniejącej encji z wartościami opisowymi do zobacz, czy coś się zmieniło. Kiedy parser wykryje w ten sposób, że obiekt został zmodyfikowany, aktualizuje wartości istniejącej jednostki w MOC-Child z nowymi wartościami w opisie, a następnie zapisuje MOC-Child, aby przesunąć zmiany do MOC-Parent.
Tutaj wszystko idzie nie tak. Myślałem, że zmiany dokonane w pobranej jednostce w MOC-Child, kiedy zostaną zepchnięte do rodzica poprzez zapisanie go, po prostu "pojawiają się" w "tej samej" jednostce w MOC-Parent. Jednak widzę, że zmieniony byt z MOC-Child został dodany do MOC-Parent, , jakby był całkowicie oddzielnym i nowym bytem; z takim skutkiem, że MOC-Parent, a tym samym napędza go zobaczyć stół, kończy się dwa jednostek dla każdej zmodyfikowanej jednostki:
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
Co daje? Co muszę zrobić, aby zmienić wartości istniejącej jednostki w MOC-Parent, jeśli nie mogę tego zrobić w MOC-Child? A jeśli mógłbym to zrobić w MOC-Child, co jeszcze muszę zrobić, oprócz zapisania MOC-Child, aby wprowadzić zmiany w MOC-Parent bez dodawania encji po raz drugi?
Z góry dziękujemy za wszelką pomoc lub wgląd, jaki możesz zaoferować!
Carl
P.S. Kilka wyjaśnień. Kiedy mówię, że zmieniona jednostka jest dodana do MOC-Parent, mam na myśli to, że NSFetchedResultsController monitorujący MOC-Parent wydaje typ zmiany NSFetchedResultsChangeInsert (nie typu zmiany NSFetchedResultsChangeUpdate) dla zmienionego obiektu, mimo że " ten sam "podmiot jest już obecny w MOC-Parent.
Ponadto, gdy mówię "ten sam" podmiot, mam na myśli podmiot w MOC-Parent, który ma ten sam identyfikator podany w opisie (w tym przypadku NSString) jako podmiot, który został zmieniony w MOC-child (nie koniecznie ten sam objectID, w rzeczywistości najwyraźniej mający inny objectId).
Mam ten sam problem. Mam NSFetchedResultsController dołączony do zagnieżdżonych kontekstów z UIManagedDocument. Właśnie ładuję z serwera na rodzica w tle, a następnie pokazuję go od dziecka na pierwszym planie. Ale nie działa właściwie bez względu na wszystko. Jeśli zamknę aplikację i ponownie ją otworzę, ładuje się ona doskonale z pamięci. Dziwny. –