加快通过UIManagedDocument将对象插入Core Data?

时间:2012-10-15 17:06:52

标签: iphone cocoa-touch core-data

我正在使用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上下文合并的内容,但我不确定这些内容是否适合或如果它是如何做到的。任何帮助/信息将不胜感激。

1 个答案:

答案 0 :(得分:2)

1)将上下文中的撤消管理器设置为nil:

[moc setUndoManager:nil]

如果您在保存期间永远不会撤消,则不需要撤消信息。

2)您已经通过添加一个具有单个保存的对象进行批处理。

3)使用较小批量的实验。最后一个大的保存可能会有问题,虽然1000应该没问题。

4)如果更改批量大小,您还需要尝试释放已创建的对象。