延迟加载CoreData关系

问题描述:

延迟加载CoreData关系的正确方法是什么?延迟加载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; 
} 

这是一个可怕的想法,你不应该这样做。

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

在您的设置中,您隐藏了写入核心数据的事实。所以简单地访问project.filter将导致核心数据写入。如果您试图管理何时何地写入核心数据,开发人员很难将其视为写入内容。

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

+0

好点,这会是更好的方法吗? – trapper

+0

'createFilterPropertyIfNeeded'方法会更好。 –