2016-09-06 24 views
15

W mojej aplikacji mam NSFetchResultController do ładowania obiektów Core Data w UITableView. Żądanie pobrania skojarzone z tym FRC używa nowej właściwości viewContext dostępnej dla NSPersistentContainer (iOS10).Dane podstawowe iOS10: viewContext nie otrzymuje aktualizacji z newBackgroundContext() z NSFetchResultController

Po wybraniu komórki przekazuję obiekt Core Data do nowego kontrolera ViewController. Ten nowy znak VC nadal wykorzystuje obiekt viewContext. Z tego ViewController, mogę zaktualizować obiekt Core Data z ViewControllers przedstawione modalnie. Aby to zrobić, używam newBackgroundContext() dla modalnych ViewController. Mogę zapisać obiekt Core Data aktualizacji bez żadnych problemów.

Problem polega na tym, że FRC nie jest automatycznie aktualizowany za pomocą obiektu Core Data aktualizacji z kontekstu tła. Wygląda to tak, jakby obiekt viewContext nie był odbierany i nie obsługiwał aktualizacji obiektu Core Data.

Jeśli ustawię automaticallyMergesChangesFromParent na wartość true dla viewContext (szerokiej aplikacji), FRC pobiera zaktualizowany obiekt Core Data, gdy zapisuję kontekst tła. Z mojego punktu widzenia viewContext powinien automatycznie zarządzać scalaniem danych. Dokumentacja opisuje viewContext za pomocą: "Ten kontekst jest skonfigurowany do generowania i automatycznego korzystania z powiadomień o zaporach z innych kontekstów."

Czy możesz wyjaśnić, jak obsługiwać różne konteksty za pomocą kontrolera NSFetchResultController?

Dzięki, Axel

Odpowiedz

5

Nie napotkasz tego bezpośrednio, ale Twój problem wydaje mi się dziwne, jeśli newBackgroundContext były w rzeczywistości warstw pod viewContext ponieważ każdy zaoszczędzić z nowym kontekście byłby tylko zaktualizować viewContext , który musiałby również zrobić własny zapis, aby uzyskać zmiany w magazynie trwałym (które, jak mówisz, dzieje się prawidłowo). Na podstawie tego podejrzenia, spojrzałem na docs deweloperskich gdzie Apple mówi:

Wywołanie tej metody (newBackgroundContext()) powoduje trwałe opakowanie i powrócić do tworzenia nowego NSManagedObjectContext z concurrencyType ustawiony privateQueueConcurrencyType. Ten nowy kontekst zostanie powiązany z NSPersistentStoreCoordinator bezpośrednio pod numerem i ustawiony na automatyczne odbieranie transmisji NSManagedObjectContextDidSave.

W ten sposób nie byłoby relacji rodzic-dziecko z viewContext. Opierając się na wytycznych, wydaje się, że nowy kontekst byłby powiadamiany o zmianach w starym, ale nie vice versa, więc musiałbyś odświeżyć widok viewContext, gdy zmieni się nowy kontekst, co możesz zrobić programowo, jeśli możesz śledzić w swoim kodzie lub może użyć jednego z powiadomień o zmianach w NSManagedObjectsContext, aby uruchomić akcję.

+2

dokumentacji (w NSManagedObjectContext.h) dla .automaticallyMergesChangesFromParent mówi:” Niezależnie od kontekstu automatycznie scala zmiany zapisane do koordynatora lub kontekst nadrzędny. Ustawienie tej właściwości na YES, gdy kontekst jest przypięty do długoterminowego generowania zapytań, nie jest obsługiwane. "Tak więc wygląda na to, że przypadek braku rodzica jest objęty" koordynatorem sklepu ".viewviewer i .newBackgroundContext mają tego samego koordynatora sklepu (Właśnie to sprawdziłem) Więc ustawienie .automatycznieMergesChangesFromParent spowodowałoby oczekiwane zachowanie –

19

Widzisz prawidłowe zachowanie. Jeśli chcesz, aby obiekt viewContext automatycznie pobierał zmiany z innych kontekstów, w tym utworzonych przez newBackgroundContext(), musisz ustawić automaticallyMergesChangesFromParent na true.

Zgadzam się, że dokumenty są mylące w tym punkcie, "... i automatycznie zużywają powiadomienia o zapisach z innych kontekstów.„

+2

Nie działa dla mnie! – Ramis

+1

Działa dla mnie.Dziękuję za radę! – glebus

+2

Nie działa też dla mnie !!! – Satyam

4

automatycznie scalić zmiany z rodzicem musi ustawić na viewContext jak ten:

persistentContainer.viewContext.automaticallyMergesChangesFromParent = true