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/MagicalRecordDeprecationMacros.h 文件