在后期保存上下文 - 将指针保存到上下文?核心数据

时间:2013-10-01 10:05:53

标签: ios objective-c core-data nsmanagedobjectcontext magicalrecord

我有以下代码将新实体插入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];

3 个答案:

答案 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] - 它将在当前线程的上下文中创建