延迟加载CoreData关系

时间:2017-09-14 03:26:09

标签: ios objective-c core-data lazy-loading

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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