У меня серьезные проблемы после переноса основной логики данных на RKManagedObjectStore. Я установил NSFetchedResultsController с контекстом, установленным на [NSManagedObject managedObjectContext] в основном потоке в контроллере представления:
assert([NSThread isMainThread]);
NSManagedObjectContext* context = [NSManagedObject managedObjectContext];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:[Item fetchRequest] managedObjectContext:context sectionNameKeyPath:nil cacheName:@"Master"];
Я вставляю объекты в контекст следующим образом:
Item* item = [Item object];
item.name = @"Foo";
[[RKObjectManager sharedManager].objectStore save];
Но контроллер fetched results не получает уведомлений об изменениях. Поэтому я зарегистрировал уведомление вручную:
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
NSLog(@"Context changed");
[self.fetchedResultsController performFetch:nil];
[self.tableView reloadData];
}];
Я думаю, что в этом нет необходимости, так как RKManagedObjectStore объединяет изменения в разных контекстах. Во-вторых, для удаления объекта Item я попробовал
[item deleteEntity];
Это привело к ошибке, говорящей, что объект не может быть удален в другом контексте. Очевидно, что это правда, но ПОЧЕМУ, черт возьми, контекст не является тем же самым экземпляром для главного потока? Я вызываю следующее также внутри контроллера представления непосредственно перед удалением сущности en:
assert([NSThread isMainThread]);
NSManagedObjectContext* sameContext1 = [NSManagedObject managedObjectContext];
NSManagedObjectContext* sameContext2 = self.fetchedResultsController.managedObjectContext;
assert(sameContext1 == sameContext2); //FAILS
Если посмотреть на managedObjectContext геттера RKManagedObjectStore, который вызывается при использовании [NSManagedObject managedObjectContext], то должен возвращаться один и тот же экземпляр для каждого потока:
-(NSManagedObjectContext*)managedObjectContext {
NSMutableDictionary* threadDictionary = [[NSThread currentThread] threadDictionary];
NSManagedObjectContext* backgroundThreadContext = [threadDictionary objectForKey:RKManagedObjectStoreThreadDictionaryContextKey];
...
}