0

我正在使用新的 iOS 5 核心数据并发选项。我有两个线程:

mainContext: NSMainQueueConcurrencyType
backgroundContext: NSPrivateQueueConcurrencyType, parent = mainContext

我有一个名为 squareObject 的对象,它当前由主上下文获取并拥有。我修改了这个对象的一个​​属性,比如说

squareObject = [getSquareObjectForContext:mainContext];
squareObject.isPendingChange = [NSNumber numberWithBool:YES];

然后我保存这个上下文。现在,我在 backgroundContext 上执行 fetch:

[backgroundContext performBlock^{
    ...
    pendingSquares = [[appDelegate.serverMOC executeFetchRequest:fetchRequest error:&error] mutableCopy];
    [pendingSquares filterUsingPredicate:[NSPredicate predicateWithFormat:@"isPendingChange == YES"]];
}];

但是,我确实取回了项目,但它们都没有 isPendingChange 的新值 1。

为什么更改没有传播到 backgroundContext?根据文档:

您在一个上下文中对托管对象所做的更改不会传播到不同上下文中的相应托管对象,除非您重新获取或重新故障该对象。

所以我确实重新获取了,但没有提交更改。而且我认为在进行更改后我真的不需要保存 mainContext 以使其出现在 backgroundContext 中,对吗?

如果方形对象归 backgroundContext 所有,那么一切正常:

   squareObject = [getSquareObjectForContext:backgroundContext];
   squareObject.isPendingChange = [NSNumber numberWithBool:YES];

显然,当我在 backgroundContext 中获取这些更改时会出现这些更改,因为更改是在该上下文中进行的。我只是不明白为什么子上下文无法使用全新的获取请求获取父上下文所做的更改。我以为这是这样做的方法?

4

1 回答 1

1

所以我确实重新获取了,但没有提交更改。而且我认为在进行更改后我真的不需要保存 mainContext 以使其出现在 backgroundContext 中,对吗?

这个假设是不正确的。您必须保存子上下文才能使更改出现在父上下文中。

但是当你保存父上下文时,它会自动触发先保存子上下文。

即使保存,当我获取时它也不会出现在子上下文中。

This is because changes are propagated from child to parent, not the other way around.

于 2012-06-29T07:53:31.747 回答