iphone - 通过 UIManagedDocument 加速将对象插入到 Core Data 中?

标签 iphone cocoa-touch core-data

我正在使用 UIManagedDocument 在应用程序中设置核心数据。然后,我循环添加大约 1000 个 NSManagedObject 到数据库中。我最初使用以下方法处理后台线程中对象的数据:

dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(backgroundQueue, ^{
    // PROCESS OBJECTS HERE
    ...
    ...

在从后台线程将它们添加到核心数据之前:

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 秒,在插入所有对象之前,我不会对核心数据进行任何保存,因此所有操作都在内存中完成,没有 I/O 开销。正如您所看到的,我的处理都是在后台线程上完成的,但是当我将新对象插入到 Core Data 中时,我必须使用 PerformBlock: 来确保插入是在 UIManagedDocument 最初所在的主线程上完成的创建。

我想知道的是,有没有一种方法可以加快插入对象的速度,也许可以通过“批处理”多个 NSManagedObjects 并将它们一次添加到一起,或者只是需要相同数量的时间就像我现在所做的那样(它仍在添加 1000 多个对象)。

我确实读过一些有关创建新上下文,然后将其与 NSManagedDocument 上下文合并的内容,但我不确定这是否合适或如何执行。任何帮助/信息将不胜感激。

最佳答案

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

[moc setUndoManager:nil]

如果您在保存过程中永远不会撤消,则不需要撤消信息。

2) 您已经通过一次保存添加多个对象来进行批处理。

3) 尝试较小的批量大小。虽然 1000 次应该没问题,但最后一次大的保存可能会出现问题。

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

关于iphone - 通过 UIManagedDocument 加速将对象插入到 Core Data 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12900553/

相关文章:

iphone - sqlite3 无法为我读取数据库,但在另一台机器上无法读取数据库

iphone - iPhone 中的网络服务

iphone - 当用户做出选择时如何隐藏 UIPickerView

iphone - 如何检测 iPhone 的翻盖?

iphone - 自定义 UITableViewCells

iphone - 如何使用 ABAddressBook 删除 iPhone 通讯录中的记录?

ios - 在应用程序关闭之前,Core Data 不会保存数据

objective-c - AVAudioPlayer不断崩溃在这一行? (正在初始化)

iOS 从服务器同步对象的 json 列表

iphone - 需要一些帮助来理解 Core Data 中的 transient 属性