匹配CoreData保存回调通知

时间:2011-06-14 14:25:19

标签: objective-c ios core-data concurrency

我想在此选择某人的大脑。我有一个专用的保存NSManagedObjectContext和GCD队列,我可以从中运行它。每当新数据进入我的应用程序时,我将其保存在该上下文中并将更改合并到主上下文中。我的问题出现在告诉主线程刚刚发生了什么。在我调用save之后,我的当前上下文现在是最新的,但是如果我在主上下文中触发一个方法,那么它的上下文就不是。如果我等待NSManagedObjectContextDidSave通知,并且我保存了三次,我现在有三个排队的委托调用,但没有办法将它们与进来的通知相匹配。有没有人知道一个很好的方法来解决这个问题? / p>

修改

我最终做的是为每个保存操作创建一个新的上下文,并在保存通知到达时附加要调用的块。看起来像这样http://pastie.org/2068084

2 个答案:

答案 0 :(得分:1)

从您对上述评论的回答中,我看到您在通知中传递了managedObjectContext。我对异步内容没有那么自信,但我确实认为你违反了一些并发规则,如果我从NSManagedObjectContext Class Reference正确解释这个引用:

  

并发   核心数据使用线程(或序列化队列)限制来保护托管对象和托管对象上下文(请参阅“与核心数据并发”)。这样做的结果是上下文假定默认所有者是分配它的线程或队列 - 这由调用其init方法的线程确定。因此,您不应该在一个线程上初始化上下文,然后将其传递给另一个线程。相反,您应该将引用传递给持久性存储协调器,并让接收线程/队列创建一个从该派生程序派生的新上下文。

我会说,尝试在通知中传递持久性存储协调器,并在块中重新创建托管对象上下文。

答案 1 :(得分:0)

我不确定你的意思,“......如果我在主上下文中触发一个方法,它的上下文不是。如果我等待NSManagedObjectContextDidSave ......”这意味着你不会等到上下文已合并。如果是这样,那就是你无法访问数据的原因,它只是不在前面的上下文中。

您是否在收到通知后 后从前台上下文中呼叫mergeChangesFromContextDidSaveNotification: