保存时的NSManagedObjectContext层次结构

时间:2014-06-13 15:34:18

标签: core-data

我已经看过一些例子,你可以这样做:

_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的模态视图。这就是我看到的大部分示例代码是在您的"添加项目"之后创建新项目的方式。视图正在显示。问题是如果你点击Add Item,点击Cancel,然后再次点击Add Item,你现在会在上下文中浮动两个NSManagedObjects。

1 个答案:

答案 0 :(得分:0)

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

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

注意,如果您打算创建一个临时子上下文以便在UI之间传递数据,请将上下文创建为并发类型为NSMainQueueConcurrencyType的子项,这样您就可以直接从主线程设置属性,而不是而不是performBlock:他们。

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