2012-05-27 45 views
1

我试图找出现在我所有的核心数据都是在主线程上使用单个上下文进行管理。我使用了仪器,并注意到保存操作在一段时间内阻塞了主线程。我想使用GCD在后台线程上运行我的保存操作iOS保存主线程NSManagedObjectContext在后台更改

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

但是,当我创建一个新的上下文所有从主线程的上下文需要插入/合并到新的变化,否则它不会有任何保存?我似乎可以找到任何这方面的例子。

例如在我的主要背景IVE:

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

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

当应用程序启动并让它在主线程上监听NSManagedObjectContextObjectsDidChangeNotification以不断保持同步时,创建背景上下文是否合理?

回答

1

在iOS5中,您可以使用新的并发类型轻松完成此任务。如果使用NSPrivateQueueConcurrencyType创建上下文,则不会阻止主线程。但是您必须访问传递给managedObjectContext:performBlock方法的块内的上下文。

+0

对于迟到的回应感到抱歉,我想测试,而且看起来我可以按照自己喜欢的方式工作,只需要退出一些重构:)感谢您的提示! –

0

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

+0

那么你的说法是,创建nsmanagedobject的上下文必须是保存它的那个上下文?并且无法将主线程上下文中创建的对象的保存操作移动到后台操作中? –

+0

不幸的是,是的。如果你想在背景上进行保存,你必须在那里移动你的背景。 – Adam

+0

我之前需要做到这一点,这是我做的:1.在后台创建新的上下文。 2.在那里获取并更新对象。但是,我不得不在我的主线程上下文中重新获取对象。 – Adam

相关问题