【问题标题】:Speeding up inserting objects into Core Data via UIManagedDocument?通过 UIManagedDocument 加速将对象插入核心数据?
【发布时间】:2012-10-24 10:49:41
【问题描述】:

我正在使用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 开销。如您所见,我的所有处理都是在后台线程上完成的,但是当我将新对象插入核心数据时,我必须使用 performBlock: 以确保在 UIManagedDocument 最初所在的主线程上完成插入已创建。

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

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

【问题讨论】:

    标签: iphone cocoa-touch core-data


    【解决方案1】:

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

    [moc setUndoManager:nil]
    

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

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

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

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

    【讨论】:

    • 感谢您的帖子,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2014-10-10
    • 2012-07-14
    • 2021-09-03
    相关资源
    最近更新 更多