0

我有下面的代码插入一个新的实体到核心数据模型(通过神奇的记录):在后期保存上下文 - 将指针保存到上下文?核心数据

- (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线程中调用类,并使用这个参考 - 在调用的类即:

NSManagedObjectContext * context = [NSManagedObjectContext contextForCurrentThread]; 
[context save]; 

回答

-1

是的,你可以循环后保存上下文。这比在每次迭代中保存好得多。如果你看看MagicalRecord src,你会发现MR_contextForCurrentThread对于同一个线程总是返回相同的上下文,如果没有线程的话,MagicalRecord会创建它。
此外,你不需要通过上下文[_entityClass createInContext:context],只是[_entityClass MR_createEntity] - 这将是对当前线程的上下文中创建

+0

对不起,这是错误的。首先,现在不推荐使用contextForCurrentThread。它已经在MagicalRecord 3.0中被删除,所以现在是习惯不使用它的时候了。您可以指定上下文,但应该使用限制上下文,并将默认上下文作为父级,或者让它观察新上下文中的更改,并在保存时合并它们。 – casademora

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]; 
相关问题