iOS/Objective-C:在后台线程中保存到核心数据

Posted

技术标签:

【中文标题】iOS/Objective-C:在后台线程中保存到核心数据【英文标题】:iOS/Objective-C: Save to core data in background thread 【发布时间】:2016-12-29 03:16:11 【问题描述】:

我正在尝试遵循此 Apple 示例代码,以在包含此代码的后台保存到核心数据的最佳实践:

NSArray *jsonArray = …; //JSON data to be imported into Core Data
NSManagedObjectContext *moc = …; //Our primary context on the main queue

NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[private setParentContext:moc];

我的主要 MOC 保存在一个属性中。但是,无论我是分配一个新的 MOC 还是使用属性中的 MOC,我都会收到错误消息:

'Parent NSManagedObjectContext must use either NSPrivateQueueConcurrencyType or NSMainQueueConcurrencyType.'
*** First throw call stack:

据说解决这个问题的方法是为 MOC 指定并发类型,如下所示:

managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

这应该在主核心数据堆栈中完成吗?还是您创建一个新的 MOC?我尝试创建一个新的 MOC 并收到 MOC 为空的错误。创建第二个 MOC 似乎也是多余的,而私有的 MOC 是三个。另一方面,我害怕更改主要核心数据堆栈,因为它可能会在应用程序中抛出其他东西。

解决此问题的最佳方法是什么?

【问题讨论】:

【参考方案1】:

主 MOC 应该是后台私有 moc 的子代,而不是相反。每当您保存主 moc 时,私有 moc 都会更新(因此您需要设置 mergePolicy),然后保存到磁盘。在这种情况下,您不需要超过 2 个 mocs。

因为保存会在后台线程中,所以你的代码会在主线程中运行更流畅。

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; // primary context on the main queue
moc.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

NSManagedObjectContext *privateMoc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
privateMoc.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
[moc setParentContext:privateMoc];

【讨论】:

以上是关于iOS/Objective-C:在后台线程中保存到核心数据的主要内容,如果未能解决你的问题,请参考以下文章

ios/objective-c:保存核心数据时出错

合并到主线程上下文时,在后台线程上下文中更新的可转换属性未保存

从后台线程保存数据时核心数据崩溃

在后台线程问题中将服务器数据保存到核心数据

保存在后台线程未完成

IOS/Objective-C:从完成块中检索 NSArray