有时我需要使用从服务器响应创建的另一个临时托管对象来更新已经存在的托管对象。必须丢弃临时对象,并在更新操作后立即保存另一个临时对象。在MagicalRecord(MR)2.3 ++中,建议保存如下对象:
- (void)updateObject:(NSManagedObject*)alreadyPersistedObject withDictionary:(NSDictionary*)dictionary {
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
NSManagedObject *updatedObject = [NSManagedObject MR_createEntityInContext:localContext];
[MyParserHandler parseDictionary:dictionary intoManagedObject:updatedObject];
// update some properties of alreadyPersistedObject using updatedObject
}];
}
我知道我们应该在早期版本的MR中使用临时本地上下文初始化临时对象。 MR 2.3及更高版本也是如此吗?
如果是,有人可以给我一个代码示例,并且需要临时上下文是[NSManagedObjectContext MR_defaultContext]的子代,以及如何在使用后丢弃此上下文?
如果否,现在首选的技术是什么?
非常感谢你的帮助!
答案 0 :(得分:1)
只是为了重述问题,您尝试将现有数据从外部数据源更新到核心数据存储中。您可以创建背景上下文并拥有导入此外部数据的临时对象,然后保存。因此,您要做的是将这些新更改传播到现有的内存中对象。
如果是这种情况,那么如果您只是使用该方法的主体,MagicalRecord提供的默认上下文将在该块完成时具有这些更新。 MagicalRecord正试图为你做很多合并工作。如果您只是在saveWithBlock:
方法中创建临时对象,则保存最终会将这些更改合并到默认上下文中。因此,如果您的对象位于该上下文中,则它们将因保存而接收这些更改。
如果您发现需要对数据合并进行更多控制,我建议您使用内置的Core Data合并机制,而不是尝试手动合并。在这种情况下,您应该使用父/子上下文关系,或NSManagedObjectContextDidSaveNotification
来合并来自另一个上下文的更改。这些解决方案的代码在互联网上相当普遍。