【发布时间】:2012-04-05 04:41:40
【问题描述】:
你好(实际问题在底部)。
在 iOS 5 中,CoreData 中引入了父子托管对象上下文。
我有一个标准的 NSFetchedResultsController 和 UITableVeiwController 一起工作以从商店获取主列表。获取的结果控制器的托管对象上下文是具有父上下文的子对象:
// AppDelegate.m
- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil)
{
return __managedObjectContext;
}
__managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
// primary managed object context has NSPrivateQueueConcurrencyType
[__managedObjectContext setParentContext:[self primaryObjectContext]];
return __managedObjectContext;
}
表格视图控制器提供了一个模态视图控制器来添加新记录,但使用单独的托管对象上下文来执行此操作(此上下文是父上下文的另一个子上下文)。此上下文保存在表视图控制器的委托回调中:
- (void)addGame
{
// New child context
[self setBuildManagedObectContext:[[NSManagedObjectContext alloc] init]];
[[self buildManagedObectContext] setParentContext:[[[self team] managedObjectContext] parentContext]];
Team *buildTeam = (Team *)[[self buildManagedObectContext] objectWithID:[[self team] objectID]];
Game *buildGame = [NSEntityDescription insertNewObjectForEntityForName:@"Game"
inManagedObjectContext:[self buildManagedObectContext]];
[buildGame setTeam:buildTeam];
BuildViewController *buildVC = [[BuildViewController alloc] initWithGame:buildGame delegate:self];
UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:buildVC];
[[self navigationController] presentViewController:navCon animated:YES completion:nil];
}
#pragma mark - Build view controller delegate
- (void)buildViewController:(BuildViewController *)controller didFinishWithSave:(BOOL)save
{
if (save)
{
NSError *error = nil;
if (![[self buildManagedObectContext] save:&error])
{
NSLog(@"Error saving new game");
abort();
}
}
[self setBuildManagedObectContext:nil];
[[self navigationController] dismissViewControllerAnimated:YES completion:nil];
}
问题:
据我了解,对于父子上下文,父上下文会从其子上下文获取保存通知,然后通知其所有子上下文。所以在我的例子中,构建上下文应该触发父上下文告诉获取的结果控制器合并更改。
这对我来说没有发生,记录已成功创建,但获取的结果控制器没有拾取它们。我知道过去的情况是您必须从保存通知中实现自己的合并(如CoreDataBooks 所示)。但我认为孩子-父母的背景解决了这个问题。我试着救了孩子,然后救了父母,但似乎没有什么不同。有人可以向我解释一下吗? (注意:这些不是单独/后台线程上的上下文)
非常感谢
【问题讨论】:
标签: objective-c core-data ios5