延迟加载 CoreData 关系

Lazy load CoreData relationship

延迟加载 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;
}

这是个糟糕的主意,你不应该这样做。

在一个非常简单的核心数据堆栈中,您可以在主线程上拥有所有内容 运行。但是随着您的应用程序变得越来越复杂,您几乎总是需要有背景上下文。如果您有多个上下文同时写入核心数据,您可能会遇到合并冲突。您可以告诉 core-data 自动解决合并的冲突——但这不是一个很好的解决方案,因为您肯定会以这种方式丢失数据。所以一个常见的解决方案是有一个单独的队列用于写入并使用主线程队列仅用于读取。

在您的设置中,您隐藏了正在写入核心数据的事实。因此,简单地访问 project.filter 将导致写入核心数据。如果您试图管理何时何地写入核心数据,那么开发人员很难将其识别为写入。

即使您的核心数据没有使用此设置,开发人员知道他何时写入核心数据几乎总是很重要。写入后,您必须保存。写入后,您可能需要注意它会影响获取的结果控制器。写入后,您可以获得合并的冲突。