MagicalRecord saveWithBlockAndWait

Posted

技术标签:

【中文标题】MagicalRecord saveWithBlockAndWait【英文标题】: 【发布时间】:2014-01-03 19:03:36 【问题描述】:

对于使用 MagicalRecord 在核心数据中进行批量插入/更新/删除的 ios 应用程序:使用 saveWithBlockAndWait 是否会执行任何批量保存到持久存储?根据 Apple 的建议,保存操作必须分批完成(例如将 50 或 100 条记录保存到磁盘)以避免内存增加。一定要打电话

[lcoalContext save:nil];

在 saveWithBlockAndWait 内的某个固定时间间隔?这里 lcoalContext 是 NSManagedObjectContext 的一个实例,可从 saveWithBlockAndWait 方法获得。

【问题讨论】:

您应该经常检查错误。路过nil有自找麻烦。如果没有其他问题,请将其打印到NSLog() 如果您正在使用 MagicalRecord 并正在编译 DEBUG 构建,则会自动捕获并记录所有 Core Data 错误,除非您明确禁用它们。 感谢您的评论,但我的问题与错误处理无关。我关心批量使用 saveWithBlockAndWait 进行批量保存。 【参考方案1】:

这是我对您的需求的建议:

    为整个插入/更新/删除过程创建一个单独的 NSManageObjectContext。 使用此上下文创建/更新/删除您的实体。 (请记住,每个 MR 服务都有一个实现,您可以指定要在其中执行操作的上下文)。 您必须创建一个计数器来观察何时应保存上下文。 定期在给定上下文中调用 save。

我直接为你写了一个简短的例子:

- (void) batchProcessToCreate1000Objects
    //This will create a separated context which is the child of the main context. You can use MR_newPrivateQueueContext instead of this if you would like to use a fully separated context (it won't merge the changes into the main context).
    NSManagedObjectContext* localContext = [NSManagedObjectContext MR_context];
    for (int counterToObservWhenToSave = 0; counterToObservWhenToSave < 1000; counterToObservWhenToSave++) 
        YourManagedObject* objectToInsert = [NSManagedObject MR_createEntityInContext:localContext];
        objectToInsert.name = @"Chris P. Backon";
        objectToInsert.is***Example = @YES;
        if (counterToObservWhenToSave > 0 && (counterToObservWhenToSave % 50 == 0)) 
            [localContext MR_saveToPersistentStoreAndWait];
        
    


而且,请注意: 你永远不应该在 saveWithBlockAndWait 函数中调用 save:。此功能将自动保存(如果您在块内进行了任何 CD 更改)。

祝你编码好运!

【讨论】:

以上是关于MagicalRecord saveWithBlockAndWait的主要内容,如果未能解决你的问题,请参考以下文章

在并发 NSOperation (MagicalRecord-2.3) 中使用 MagicalRecord 的正确方法

MagicalRecord:后台保存

未找到 MagicalRecord/MagicalRecordDeprecationMacros.h 文件

WatchKit 和 MagicalRecord - 这可能吗?

MagicalRecord 3.0 设置

MagicalRecord 日期解析