Mam poważne problemy od czasu migracji mojej podstawowej logiki danych do RKManagedObjectStore. I konfiguracji NSFetchedResultsController z kontekstem ustawiony [NSManagedObject managedObjectContext] W głównym gwintem w widoku kontrolera:Restkit [NSManagedObject managedObjectContext] zwraca różne instancje
assert([NSThread isMainThread]);
NSManagedObjectContext* context = [NSManagedObject managedObjectContext];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:[Item fetchRequest] managedObjectContext:context sectionNameKeyPath:nil cacheName:@"Master"];
wstawić obiektów w kontekście tak:
Item* item = [Item object];
item.name = @"Foo";
[[RKObjectManager sharedManager].objectStore save];
ale z pobranego sterownika wyników nie otrzymuje powiadomień o zmianach. Tak więc zarejestrował zgłoszenie ręcznie:
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
NSLog(@"Context changed");
[self.fetchedResultsController performFetch:nil];
[self.tableView reloadData];
}];
To naprawdę nie powinno być konieczne, myślę, ponieważ RKManagedObjectStore scala zmiany w różnych kontekstach. Po drugie, w celu usunięcia obiektu obiektu wypróbowałem:
[item deleteEntity];
Powstał błąd informujący, że obiektu nie można usunąć w innym kontekście. Jest to oczywiście prawda, ale czyż piekło jest kontekstem, a nie przypadkiem głównego wątku? Wzywam następujące także wewnątrz kontrolera widoku tuż przed usunięciem pl jednostki:
assert([NSThread isMainThread]);
NSManagedObjectContext* sameContext1 = [NSManagedObject managedObjectContext];
NSManagedObjectContext* sameContext2 = self.fetchedResultsController.managedObjectContext;
assert(sameContext1 == sameContext2); //FAILS
Patrząc na RKManagedObjectStore za managedObjectContext pochłaniacza Wdrażania które nazywa się podczas korzystania [NSManagedObject managedObjectContext], ta sama instancja za wątku powinny być zwrócone:
-(NSManagedObjectContext*)managedObjectContext {
NSMutableDictionary* threadDictionary = [[NSThread currentThread] threadDictionary];
NSManagedObjectContext* backgroundThreadContext = [threadDictionary objectForKey:RKManagedObjectStoreThreadDictionaryContextKey];
...
}