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:在后台线程中保存到核心数据的主要内容,如果未能解决你的问题,请参考以下文章