我正在使用UIManagedDocument
在应用程序中设置Core Data。然后我在循环中向数据库添加大约1000 NSManagedObject
(s)。我最初使用以下方法处理后台线程中对象的数据:
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(backgroundQueue, ^{
// PROCESS OBJECTS HERE
...
...
在从后台线程将其添加到Core Data之前:
NSManagedObjectContext *moc = [[self managedDocument] managedObjectContext];
[moc performBlock:^{
// ADD TO CORE DATA
...
...
使用:
// CREATE
Fruit *fruit = [NSEntityDescription insertNewObjectForEntityForName:@"Fruit" inManagedObjectContext:context];
// POPULATE
[fruit setName:name];
[fruit setAge:age];
[fruit setType:type];
...
我的问题是:
对1000多个对象执行上述操作目前大约需要2.2秒,在插入所有对象之前,我没有对Core Data进行任何保存,因此所有对象都在内存中完成,没有I / O开销。正如您在上面所看到的,我所有的处理都是在后台线程上完成的,但是当我将新对象插入到Core Data中时,我必须使用performBlock:以确保插入在UIManagedDocument最初的主线程上完成创建
我想知道的是,有没有办法加快插入对象,可能是通过将一些NSManagedObjects“批处理”在一起并在一次点击中添加它们,或者只是采用相同数量的我正在做的时间(它仍在添加1000多个对象)。
我确实读过一些关于创建新上下文然后将其与NSManagedDocument上下文合并的内容,但我不确定这些内容是否适合或如果它是如何做到的。任何帮助/信息将不胜感激。
答案 0 :(得分:2)
1)将上下文中的撤消管理器设置为nil:
[moc setUndoManager:nil]
如果您在保存期间永远不会撤消,则不需要撤消信息。
2)您已经通过添加一个具有单个保存的对象进行批处理。
3)使用较小批量的实验。最后一个大的保存可能会有问题,虽然1000应该没问题。
4)如果更改批量大小,您还需要尝试释放已创建的对象。