核心数据不会更新反向关系

时间:2014-01-23 17:04:31

标签: ios macos core-data

我的两个实体是Book和Category。一本书可以有很多类别,一个类别可以有很多书。在数据模型中,关系被标记为彼此相反。

当我更新图书的类别时,我预计相应类别的图书会自动更新。换句话说:

Book *book = [Book insertNewObjectIntoContext:context];
Category *category = [Category insertNewObjectIntoContext:context];
[book addCategories:[NSSet setWithObject:category]];
BOOL result = [category.books containsObject:book]; // Should be YES

然而,我在我的应用中得到了NObooks返回一个空集。

我三重检查了关系被标记为反向。还有什么可以在这里发挥作用?或者有什么我想念的东西?

如果我手动设置反向关系会不会受到影响?如果我做的一切都像魅力一样。

2 个答案:

答案 0 :(得分:4)

直到运行循环结束才会更新反向关系。之后立即调用它并没有给它时间更新。

如果您要做类似的事情:

dispatch_async(dispatch_get_main_queue(), ^{
    BOOL result = [category.books contains:book];
    NSLog(@"Result: %@", result ? @"YES" : @"NO");
});

您会看到预期的结果。

更新

手动设置反向并没有什么坏处。当一切正常工作时,会导致浪费周期,因为Core Data必须仔细检查关系,这样您才能看到性能损失。

答案 1 :(得分:2)

你可以打电话

[context processPendingChanges];

强制托管对象上下文立即更新反向关系。

在事件循环期间或保存时自动调用此方法 上下文。但你也可以明确地称之为。来自文档:

  

强制接收者处理对象图的更改   ...
  您也可以手动调用它来合并任何未处理的未处理的   变化。