1

我有以下代码将新实体插入核心数据模型(通过 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];
4

3 回答 3

1

您可以通过以下方式执行此操作:

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){
    // your for loop
}];

请阅读http://saulmora.com/2013/09/15/why-contextforcurrentthread-doesn-t-work-in-magicalrecord/了解有关为什么不应该使用 contextForCurrentThread 的更多信息。

于 2013-10-01T10:28:21.727 回答
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];
于 2013-10-01T15:44:19.213 回答
-1

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

于 2013-10-01T10:23:32.183 回答