【问题标题】:Need some clarifications on refreshObject:mergeChanges:YES需要对 refreshObject:mergeChanges:YES 进行一些说明
【发布时间】:2013-02-14 05:43:49
【问题描述】:

一些背景:

我正在尝试将大量数据存储在本地数据库中,并且我希望尽可能高效地做到这一点。

场景:

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

地址联系方式

为了管理关系,我在 NSManagedObject 的每个子类中都写了一个方法,下面是一些代码 sn-p:

// 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

请提出建议。

【问题讨论】:

  • 遇到同样的问题!你有没有为这种情况找到任何解决方案?

标签: cocoa-touch core-data


【解决方案1】:

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

当您访问故障中的数据时,Core Data 会自动解决(触发)故障。这种延迟加载 相关对象更适合内存使用,并且更快地获取与很少使用相关的对象 (或非常大的)物体。 CoreData performance

您可以通过简单地实例化联系人地址之间的一对多关系来做到这一点。

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

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

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

【讨论】:

  • 嗨马克..谢谢澄清:-)
猜你喜欢
  • 1970-01-01
  • 2019-04-03
  • 2016-06-16
  • 2014-10-02
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 2013-07-17
相关资源
最近更新 更多