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

Dev*_*shi 5 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         
    }

}
Run Code Online (Sandbox Code Playgroud)

要考虑的事项:

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

题:

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

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

[[self managedObjectContext] refreshObject:self mergeChanges:YES];
Run Code Online (Sandbox Code Playgroud)

我有点困惑,想知道 -

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

请建议.

Mar*_*ski 11

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

当您访问故障中的数据时,Core Data会自动解决(触发)故障.这种相关对象的延迟加载对于内存使用来说要好得多,并且对于获取与很少使用(或非常大)对象相关的对象要快得多. CoreData性能

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

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

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

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