2012-01-20 13 views
6

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]; 
    ... 
} 

Odpowiedz

9

W końcu wyśledziłem ten paskudny błąd po wielu godzinach debugowania. Problem polega na tym, że RKObjectManager zawiera odniesienie do RKManagedObjectStore. Ale w jakiś sposób przy użyciu ARC, odniesienie nie jest przechowywane w instancji [RKObjectManager sharedManager] i jest zwalniane. To powoduje przepłukiwanie lokalnej pamięci podręcznej wątku. Dlatego scalanie kontekstu zarządzanego obiektu nie działa, ponieważ przy każdym dostępie tworzony jest nowy zarządzany kontekst. Poprawka jest łatwa. Po prostu utrzymuj silne odniesienie do RKManagedObjectStore w swoim Delegacie aplikacji i gotowe.

Powiązane problemy