需要对refreshObject:mergeChanges:YES进行一些澄清

时间:2013-02-14 05:43:50

标签: cocoa-touch core-data

某些背景:

我正在尝试将大量数据存储在本地数据库中,我希望尽可能高效地进行此操作。

情境:

有许多实体是相互关联的,例如地址与这样的联系人相关联:

  

地址<< - >接触

为了管理关系,我在NSManagedObject的每个子类中编写了一个方法,下面是一些代码片段:

// class Contact
- (void)manageRelationships
{
    @autoreleasepool {
        LocalDBManager *localDBManager = [[LocalDBManager alloc] init];

        // managing relationships

        // map associated addresses

        NSPredicate *addressIdPredicate = [NSPredicate predicateWithFormat:@"%K == %@",ADDRESSID,self.addressid];

        // below method returns an object as fault by firing a fetch request against context
         NSSet *retrievedAddresses = [localDBManager retrieveManagedObjectsForEntity:ADDR_ENTITY withPredicate:addressIdPredicate asFault:YES withPropertyValues:NO error:nil];
        self.addresses = retrievedAddresses;


        // managing few more relationships         
    }

}

需要考虑的事项:

由于对象可以有多个关系,我知道在映射关系时内存消耗会增加。

问题:

一旦关系被映射,我想把一个对象变成错误而不会丢失所做的任何更改。

从苹果文档和一些谷歌搜索,我发现我可以使用 refreshObject:mergeChanges:方法。所以我打算在manageRelationships方法的代码块末尾添加以下行:

[[self managedObjectContext] refreshObject:self mergeChanges:YES];

我有点困惑,想知道 -

  

这是否意味着对对象进行的任何更改都将是   存储在持久存储中然后该对象将转为故障?   如果是,那么我可以认为它等同于保存方法   的NSManagedObjectContext

请建议。

1 个答案:

答案 0 :(得分:11)

首先,您不需要自己管理关系。让CoreData处理它。

  

当您访问故障中的数据时,Core Data会自动解决(触发)故障。这个懒加载   相关对象对于内存使用要好得多,并且获取与很少使用相关的对象要快得多   (或非常大的)物体。   CoreData performance

您可以通过简单地实例化联系地址之间的一对多关系来实现此目的。

关于 refreshObject:mergeChanges:,你错了。它不等同于save:方法。如果将合并更改设置为YES,则仅表示:

  

如果flag为YES,则从商店或最后一个缓存状态的值重新加载对象的属性值,然后在这些(现在新更新的)值上重新应用所做的任何更改(在本地上下文中)。   Cocoa touch Doc

因此,如果您在托管对象A中进行了一些更改,然后 [context refreshObject:A mergeChanges:YES] ,则对象A仍将保持未保存状态。