Restkit [NSManagedObject managedObjectContext] возвращает разные экземпляры

У меня серьезные проблемы после переноса основной логики данных на 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];
    ...
}
6
задан Sbhklr 20 January 2012 в 12:21
поделиться