gpt4 book ai didi

objective-c - 如何通过父 MOC 将更改从一个子托管对象上下文合并到另一个子托管对象上下文?

转载 作者:太空狗 更新时间:2023-10-30 03:28:31 25 4
gpt4 key购买 nike

你好(实际问题在底部)。

在 iOS 5 中,在 CoreData 中引入了父子托管对象上下文。

我有一个标准的 NSFetchedResultsController 和 UITableVeiwController 协同工作以从商店中获取主列表。获取的结果 Controller 的托管对象上下文是一个具有父上下文的子对象:

// 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;
}

TableView Controller 提供了一个模态视图 Controller 来添加新记录,但使用单独的托管对象上下文来执行此操作(此上下文是父上下文的另一个子对象)。此上下文保存在 TableView Controller 中的委托(delegate)回调中:

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

问题:

据我了解,对于父子上下文,父上下文会从其子上下文中获取保存通知,然后通知其所有子上下文。所以在我的例子中,构建上下文应该触发父上下文来告诉获取的结果 Controller 合并更改。

这对我来说没有发生,记录已成功创建,但获取的结果 Controller 没有接收到它们。我知道过去的情况是您必须从保存通知中实现自己的合并(如 CoreDataBooks 中所示)。但我认为子 parent 上下文解决了这个问题。我试着救了 child ,然后救了 parent ,但似乎没有什么不同。有人可以向我解释一下吗? (注意:这些不是单独/后台线程上的上下文)

非常感谢

最佳答案

根据 WWDC 2011 的“What's new in Core Data”演示文稿,它说您应该这样保存:

[child save:&error]; 
[parent performBlock:^{
[parent save:&parentError];
}];

据我了解,这会导致父级接收并合并来自子级上下文的更改。需要注意的一件事是父项和所有子项必须使用相同的并发类型创建。

-- 编辑删除了错误的假设,即父级将更改推送给子级,但事实并非如此。

关于objective-c - 如何通过父 MOC 将更改从一个子托管对象上下文合并到另一个子托管对象上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9791469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com