我有以下代码将新实体插入Core Data模型(通过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循环中多次运行,因此我希望仅在循环完成后保存上下文以优化性能。
我的问题是,最好的方法是什么?我应该在这里保存对上下文的引用(例如在app委托中),然后在调用类中使用此引用进行保存吗?或者我可以在调用类中再次调用NSManagedObjectContext contextForCurrent Thread并使用此引用 - 即在调用类中:
NSManagedObjectContext * context = [NSManagedObjectContext contextForCurrentThread];
[context save];
答案 0 :(得分:1)
您可以通过以下方式执行此操作:
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){
// your for loop
}];
请阅读http://saulmora.com/2013/09/15/why-contextforcurrentthread-doesn-t-work-in-magicalrecord/,了解有关不应使用contextForCurrentThread的原因的详细信息。
答案 1 :(得分:0)
如果您想在循环结束时保存,我建议您将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];
答案 2 :(得分:-1)
是的,您可以在循环后保存上下文。它比每次迭代中的保存要好得多。如果你看看MagicalRecord src,你会看到MR_contextForCurrentThread
总是返回相同线程的相同上下文,如果没有上下文线程MagicalRecord创建它。
此外,您不需要传递上下文[_entityClass createInContext:context]
,只需传递[_entityClass MR_createEntity]
- 它将在当前线程的上下文中创建