Korzystam z kontekstu obiektu zarządzanego prywatnie, aby utworzyć nowe obiekty w magazynie trwałym, a następnie po zapisaniu prywatnego MOC, łącząc je z głównym MOC przy użyciu mergeChangesFromContextDidSaveNotification
. To działa dobrze i aktualizuje interfejs użytkownika zgodnie z wymaganiami, a NSManagedObjectContextWillSaveNotification
NIE jest tutaj wywoływany dla mainMOC
.Jak ignorować zmiany w mergeChangesFromContextDidSaveNotification w NSManagedObjectContextWillSaveNotification
Następnie dokonuję pewnych zmian w mainMOC
za pomocą interfejsu użytkownika i słucham NSManagedObjectContextWillSaveNotification
. Powiadomienie zostało wysłane, ale zawiera nie tylko wprowadzone przeze mnie zmiany, ale także obiekty, które zostały scalone z PrivateMOC
przy użyciu mergeChangesFromContextDidSaveNotification
.
Czy można zignorować zmiany, które zostały scalone z innego kontekstu do mainContext
, w kolejnych powiadomieniach contextDidChange
?
Oto konfiguracja:
- (void) loadData {
privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSPrivateQueueConcurrencyType];
privateContext.persistentStoreCoordinator = self.mainContext.persistentStoreCoordinator;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(contextWillSave:)
name:NSManagedObjectContextWillSaveNotification
object: self.mainContext];
NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:record.recordType inManagedObjectContext: self.privateContext];
// fill in object
if ([self.privateContext hasChanges]) {
[self savePrivateContextAndMergeWithMainContext: self.privateContext];
}
}
- (void) savePrivateContextAndMergeWithMainContext: (NSManagedObjectContext *) privateContext {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(privateContextDidChange:) name:NSManagedObjectContextDidSaveNotification object:privateContext];
__block NSError *error = nil;
[privateContext performBlockAndWait:^{
NSLog(@"PrivateContext saved");
[privateContext save:&error];
}];
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:privateContext];
if (error) {
NSLog(@"error = %@", error);
}
}
- (void) privateContextDidChange: (NSNotification *) notification{
[self.mainContext performBlockAndWait:^{
NSLog(@"merged into mainContext");
[self.mainContext mergeChangesFromContextDidSaveNotification:notification];
}];
}
To działa prawidłowo i zapisując prywatny kontekst i wtopienie się w mainContext
nie wywołać contextWillSave
powiadomienie. Ale podczas edycji danych z interfejsu użytkownika (na głównym MOC) wyzwala powiadomienie i zawiera dane, które zostały wcześniej zapisane przy użyciu prywatnego MOC.
Mam nadzieję, że jest jasne. Daj mi znać, czy powinienem podać cokolwiek innego.
- AKTUALIZACJA -
Wydaje się, że problem jest ze specjalnie usuwanie obiektów z prywatnej kontekście. Po usunięciu z prywatnego kontekstu i wywołaniu mergeChangesFromContextDidSaveNotification
w głównym MOC, zestaw MainMoc deletedObjects
nadal pokazuje obiekt, który został usunięty. Nie dzieje się tak z wstawkami lub aktualizacjami w kontekście prywatnym. Czy to jest udokumentowane w dowolnym miejscu? Jakie może być obejście tego problemu?
Dlaczego obserwujesz także główny kontekst? Co robisz z tymi zmianami? – Wain
Głównym obserwatorem kontekstu jest nasłuchiwanie zmian wprowadzonych przez interfejs użytkownika, aby mogły być przekazywane do serwera. Dlatego nie chcę, aby zmiany wprowadzone w prywatnym kontekście pojawiały się w głównym słuchaczu kontekstu. Nie są początkowo, gdy zmiany są scalane z głównym kontekstem, ale wygląda na to, że MOC nadal zaznacza je jako "zmienione", a następnym razem, gdy zapiszesz główny kontekst, pojawią się one w obiekcie powiadomienia. –
W rzeczywistości problem wydaje się być bardziej związany z obiektami * usuniętymi * w kontekście tła, a nie wstawionymi. Te problemy powodują ten problem, ponieważ zdają się kręcić po "mergeChangesFromContextDidSaveNotification:' nazywają się –