【发布时间】:2012-02-15 00:26:49
【问题描述】:
自从我将核心数据逻辑迁移到 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];
但获取的结果控制器不会收到更改通知。因此我手动注册了一个通知:
[[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];
这产生了一个错误,指出无法在另一个上下文中删除该对象。这显然是正确的,但是 为什么 上下文与主线程的实例不同?在删除实体之前,我还在视图控制器中调用以下内容:
assert([NSThread isMainThread]);
NSManagedObjectContext* sameContext1 = [NSManagedObject managedObjectContext];
NSManagedObjectContext* sameContext2 = self.fetchedResultsController.managedObjectContext;
assert(sameContext1 == sameContext2); //FAILS
查看使用 [NSManagedObject managedObjectContext] 时调用的 RKManagedObjectStore 的 managedObjectContext getter 实现,每个线程应该返回相同的实例:
-(NSManagedObjectContext*)managedObjectContext {
NSMutableDictionary* threadDictionary = [[NSThread currentThread] threadDictionary];
NSManagedObjectContext* backgroundThreadContext = [threadDictionary objectForKey:RKManagedObjectStoreThreadDictionaryContextKey];
...
}
【问题讨论】:
标签: objective-c ios core-data restkit