Core data 保存时NSManagedObjectContext层次结构

Core data 保存时NSManagedObjectContext层次结构,core-data,Core Data,我见过一些例子,其中您可以执行以下操作: _model = [NSManagedObjectModel mergedModelFromBundles:nil]; _coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:_model]; _context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueC

我见过一些例子,其中您可以执行以下操作:

_model = [NSManagedObjectModel mergedModelFromBundles:nil];
_coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:_model];

_context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; // THIS IS THE MAIN CONTEXT
[_context setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];

_childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_childContext performBlockAndWait:^{
    [_childContext setParentContext:_context];
    [_childContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
    [_childContext setUndoManager:nil]; 
}];
然后,您可以在视图(通常是模式视图)的子上下文中将项目插入。当用户单击“取消”时,该对象仅在子上下文中,并且不会在此时保存,因此很容易创建临时NSManagedObject并丢弃它们,直到您保存两个上下文。你有什么理由不能这样做:

_parentContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_parentContext performBlockAndWait:^{
    [_parentContext setPersistentStoreCoordinator:_coordinator];
    [_parentContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
}];

_context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_context setParentContext:_parentContext];
[_context setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
现在,您可以将内容插入parentContext。然后在保存时,首先保存_context主上下文,然后冒泡到parentContext?它似乎在代码中工作,但我不知道我看到的示例都将对象插入到主上下文为父上下文的childContext中是否有原因


或者,有没有更好的方法来处理点击Add Item的用例,用为该视图创建的新NSManagedObject显示模式视图。这就是我看到的大部分示例代码在显示additem视图时创建新项的方式。问题是,如果您点击Add Item,点击Cancel,然后再次点击Add Item,您现在将有两个NSManagedObject在上下文中浮动。

Apple建议保存到磁盘的上下文为NSMainQueueConcurrencyType类型,这也适用于UI操作,例如获取和显示。其原因尚不清楚,但根据经验,您应该真正遵循这一点,因此您的主上下文类型为NSMainQueueConcurrencyType

现在,如果将对象添加到父上下文中,这些更改不会出现在子上下文中。这就是为什么您总是希望数据流向主上下文并插入到子上下文中。在第二个示例中,如果将对象添加到_parentContext,但UI正在侦听_context上的更改,则它不会听到添加了新对象或更改了对象

请注意,如果要创建用于向UI传递数据和从UI传递数据的临时子上下文,请将该上下文创建为并发类型为NSMainQueueConcurrencyType的子上下文,以便可以直接从主线程设置属性,而不必执行锁定:它们

我目前的方法不是创建上下文并直接处理对象,而是使用字典并将数据绑定到该对象。只有在用户保存后,我才创建一个新对象,将数据从字典传输到对象并保存。不确定这是否真的重要,因为子/父上下文使得这种一次性操作非常便宜和简单