延迟加载CoreData关系的正确方法是什么?
假设我有一个Project对象和一个可能已经存在或可能不存在的ProjectFilter对象,这是否会按预期工作?
- (ProjectFilter *)filter
{
[self willAccessValueForKey:@"filter"];
ProjectFilter *filter = [self primitiveValueForKey:@"filter"];
[self didAccessValueForKey:@"filter"];
if (!filter) {
filter = [NSEntityDescription insertNewObjectForEntityForName:@"ProjectFilter" inManagedObjectContext:self.managedObjectContext];
self.filter = filter;
}
return filter;
}
答案 0 :(得分:1)
这是一个糟糕的主意,你不应该这样做。
在一个非常简单的核心数据堆栈中,您可以在主线程上运行所有内容。但随着您的应用程序变得越来越复杂,您几乎总是需要具有背景上下文。如果您同时向核心数据写入多个上下文,则可能会发生合并冲突。您可以告诉核心数据自动解决合并冲突 - 但这不是一个很好的解决方案,因为您可以保证以这种方式丢失数据。因此,一个常见的解决方案是使用单个队列进行写入,并仅将主线程队列用于读取。
在您的设置中,您隐藏了您正在写入核心数据的事实。因此,简单地访问project.filter
将导致核心数据的写入。如果您正在尝试管理何时何地编写核心数据,那么开发人员很难将其识别为写入。
即使你的核心数据没有使用这种设置,开发人员知道他何时写入核心数据几乎总是很重要。写完后你必须保存。写入后,您可能需要注意它将影响获取的结果控制器。写入后,您可以获得合并的冲突。