在稍后阶段保存上下文 - 保存指向上下文的指针?核心数据
Posted
技术标签:
【中文标题】在稍后阶段保存上下文 - 保存指向上下文的指针?核心数据【英文标题】:Saving Context At a Later Stage - Saving Pointer To Context ? Core Data 【发布时间】:2013-10-01 10:05:53 【问题描述】:我有以下代码将新实体插入核心数据模型(通过 Magical Record):
- (void)insertWithData:(NSDictionary *)dataDictionary
DLog(@"Inserting %@", [_entityClass description]);
NSManagedObjectContext *context = [NSManagedObjectContext contextForCurrentThread];
id entity = [_entityClass createInContext:context];
[entity setValuesFromDictionary:dataDictionary];
if ([entity isKindOfClass:[Syncable class]])
[entity setValue:YesNumber forKey:@"syncedToServer"];
[context save];
由于此代码在从另一个类调用的 FOR 循环中多次运行,我只想在循环完成后保存上下文以优化性能。
我的问题是最好的方法是什么?我应该在此处保存对上下文的引用(例如在应用程序委托中),然后在调用类中使用此引用保存吗?或者我可以在调用类中再次调用 NSManagedObjectContext contextForCurrent Thread 并使用此引用 - 即在调用类中:
NSManagedObjectContext * context = [NSManagedObjectContext contextForCurrentThread];
[context save];
【问题讨论】:
【参考方案1】:您可以通过以下方式执行此操作:
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)
// your for loop
];
请阅读http://saulmora.com/2013/09/15/why-contextforcurrentthread-doesn-t-work-in-magicalrecord/,了解有关为什么不应该使用 contextForCurrentThread 的更多信息。
【讨论】:
【参考方案2】:如果您想在循环结束时保存,我建议您将 NSManagedObjectContext 作为参数传入:
- (void) insertData:(id)data inContext:(NSManagedObjectContext *)context;
//do all your data stuff here.
你会这样使用它:
NSManagedObjectContext *context = [NSManagedObjectContext MR_confinementContext];
for (id obj in objCollection)
[self insertData:obj inContext:context];
[context MR_save];
【讨论】:
【参考方案3】:是的,您可以在循环后保存上下文。这比在每次迭代中保存要好得多。如果您查看 MagicalRecord src,您会看到 MR_contextForCurrentThread
总是为相同的线程返回相同的上下文,如果没有线程 MagicalRecord 创建它的上下文。
此外,您不需要传递上下文 [_entityClass createInContext:context]
,只需 [_entityClass MR_createEntity]
- 它将在当前线程的上下文中创建
【讨论】:
对不起,这是错误的。首先,contextForCurrentThread 现在已被弃用。它已经在 MagicalRecord 3.0 中被删除,所以现在是时候习惯不使用它了。您可以指定上下文,但您应该使用限制上下文,并将默认上下文设置为父上下文,或者让它观察新上下文中的更改,并在保存时将其合并。以上是关于在稍后阶段保存上下文 - 保存指向上下文的指针?核心数据的主要内容,如果未能解决你的问题,请参考以下文章