iOS 在后台保存主线程 NSManagedObjectContext 更改

Posted

技术标签:

【中文标题】iOS 在后台保存主线程 NSManagedObjectContext 更改【英文标题】:iOS saving main thread NSManagedObjectContext changes in background 【发布时间】:2012-05-27 12:50:36 【问题描述】:

我现在想弄清楚我的所有核心数据都在主线程上管理,只有一个上下文。我使用了仪器并注意到保存操作阻塞了主线程很长一段时间。我想使用 GCD 在后台线程上运行我的保存操作

现在我了解了如何通过创建新线程/上下文来设置此过程并侦听“保存”通知以合并回主线程。

但是当我创建一个新上下文时,主线程上下文中的所有更改都需要插入/合并到新上下文中,否则它不会有任何东西可以保存?我似乎可以找到任何例子。

例如在我的主要上下文中:

插入了 2 个用户 删除了 3 个壁纸 更新了一些朋友关系。

现在我如何让我的背景上下文知道这些变化?

在应用程序启动时立即创建后台上下文并让它在主线程上监听 NSManagedObjectContextObjectsDidChangeNotification 以使其不断保持同步是否有意义??

【问题讨论】:

【参考方案1】:

ios5 中,您可以使用新的并发类型轻松做到这一点。如果使用 NSPrivateQueueConcurrencyType 创建上下文,则不会阻塞主线程。但是您必须访问传递给 managedObjectContext:performBlock 方法的块内的上下文。

【讨论】:

抱歉回复晚了,我想测试一下,看来我可以让它按我喜欢的方式工作,它只需要退出一些重构 :) 感谢您的提示!【参考方案2】:

您不能在线程之间传递 NSManagedObject 实例。如果您在处理大型数据集时遇到困难,您可能需要阅读 Marcus Zarra 的 this post。

【讨论】:

那么您的意思是,创建 nsmanagedobject 的上下文必须是保存它的上下文?并且没有办法将在主线程上下文中创建的对象的保存操作移动到后台操作中? 不幸的是,是的。如果你想在后台保存,你必须把你的上下文移到那里。 我之前需要这样做一次,这就是我所做的: 1. 在后台创建新的上下文。 2. 在那里获取并更新对象。但后来我也不得不在我的主线程上下文中重新获取对象。

以上是关于iOS 在后台保存主线程 NSManagedObjectContext 更改的主要内容,如果未能解决你的问题,请参考以下文章

无法从 iOS6 中的后台线程调用主线程上的代码

NSManagedObject:在单独的线程上创建

iOS 后台保存在 Core Data 中

在后台和主线程 ios 中执行

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

iOS:主线程检查器:在后台线程上调用的 UI API:-[UIView retainCount]