0

我想知道是否有办法在同一线程中运行的NSManagedObject两个或多个对象之间共享一个。NSManagedObjectContext

我有以下问题:我通过应用程序中的所有代码共享一个主要上下文,并且为我发出的每个远程获取请求创建了几个不同的上下文。(我创建了一个自定义类,它远程获取并将服务器中找到的所有对象插入到他自己的中NSManagedObjectContext)。这些获取请求可能会同时运行,因为它们使用NSURLConnection可能在不同时间结束的对象。如果相同的远程对象被不同的连接获取,我将在保存和合并上下文与主要的那一刻得到重复。(即,具有相同远程 ID 但不同的对象objectID)。

一种可能的解决方案是在创建每个对象后立即保存(并因此保留)每个对象,但我不能这样做,因为它可能有一些关系可能仍未填充并且在保存操作期间不会验证。

我真的很期待一种方法,它允许您在上下文之间共享对象的相同非持久实例。如果有人遇到此问题并提出解决方案,我将很高兴知道!

4

2 回答 2

1

除了通过它们的商店之外,上下文无法相互通信。但是,您可以插入带有 nil 托管对象上下文的托管对象,它将独立于任何上下文(尽管没有关系)。您可以随意传递该独立托管对象,并在需要持久保存它时将其插入上下文中。这是危险的,但有可能。

但是,如果您没有在单独的线程上运行每个连接,那么您不会通过拥有多个上下文获得任何收益。每个连接对象将在主线程上按顺序激活其委托。在这种情况下,您最简单的解决方案是对所有连接使用相同的委托,并让委托处理对单个上下文的插入。为防止重复,只需在 remoteID 上进行 fetch 并查看是否在为该 remoteID 插入新对象之前取回现有对象。

于 2010-07-23T13:04:19.947 回答
0

我不认为你想做的事情是可能的。我的意思是,如果您想在不同的上下文之间共享更改,则必须在保存或发生更改时使用通知并合并它。但在你的情况下,我会说只使用 1 个上下文并最终保存。或者一种不太优雅的方式:将所有远程 ID 临时保存在您的应用中,并在插入新 ID 之前进行检查。在这种情况下,您可以继续使用多个上下文并在每次完成加载后保存。

于 2013-02-20T02:14:03.970 回答