我的两个实体是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
然而,我在我的应用中得到了NO
。 books
返回一个空集。
我三重检查了关系被标记为反向。还有什么可以在这里发挥作用?或者有什么我想念的东西?
如果我手动设置反向关系会不会受到影响?如果我做的一切都像魅力一样。
答案 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];
强制托管对象上下文立即更新反向关系。
在事件循环期间或保存时自动调用此方法 上下文。但你也可以明确地称之为。来自文档:
强制接收者处理对象图的更改 ...
您也可以手动调用它来合并任何未处理的未处理的 变化。