我有一个使用Core Data的iPhone / iPad应用程序。
在我的数据库中,我只有一个表,尽管它很大(约40列)。
当我建立数据库时,我会创建并插入大约13,000个新实体,然后将其称为“saveContext”。
for (NSArray *singleDiamond in allDiamonds)
{
@try
{
if (//Some validation)
{
Diamond *diamond = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Diamond class])
inManagedObjectContext:self.managedObjectContext];
//Do setup for diamond...
}
}
@catch (NSException *exception) {NSLog(@"%@",[exception message]);}
}
NSLog(@"Start Saving Context...");
[self saveContext];
NSLog(@"End Saving Context...");
我的问题ID仅是'saveContext'方法,需要 23秒来执行。那是不可接受的。
我做错了什么吗?
如何改善此处的性能?
最佳答案
您应该在批量插入过程中多次调用 saveContext ,然后调用 reset 以“忘记”先前插入的管理对象。例如,在我的情况下,我每100个对象保存一次上下文。此外,您应该为导入创建专用的上下文并对其进行优化(通过将undomanager设置为nil,因为您无需回滚/撤消整个插入操作)。
在这里阅读:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html