保存父NSManagedObjectContext时出错

时间:2014-08-06 14:47:22

标签: objective-c multithreading core-data nsmanagedobject nsmanagedobjectcontext

我正在使用以下MOC设置:

  1. 父级 - 使用持久性存储协调器(主队列)
  2. Child1 - 使用父级(专用队列)
  3. Child2 - 使用父(私人队列)
  4. Child3 - 使用父(私人队列)
  5. 儿童会定期保存更​​改并在需要时重新生成主MOC的新快照。

    一切正常,直到我尝试保存主要MOC。这是我收到的错误消息:Cannot update object that was never inserted

      

    未解决的错误错误域= NSCocoaErrorDomain代码= 134030“操作无法完成。(Cocoa错误134030)。”UserInfo = 0x1758e200 {NSAffectedObjectsErrorKey =(       “(entity:Event; id:0x1767d3d0; data:{\ n dateBegin = nil; \ n dateEnd = nil; \ n identifier = nil; \ n identifierBegin = 0; \ n isProcessed = 1; \ n nPhotos = 0; \ n name = nil; \ n photos = \“\”; \ n})“   ),NSUnderlyingException =无法更新从未插入的对象。},

    它不会一直发生,并且消除耗时的操作会降低其发生频率。我还注意到,在异常期间,其他MOC正在忙于保存或查询。我使用performBlockperformBlockAndWait来使所有与MOC相关的操作在正确的队列上运行。

    如果相关,child1导入基础对象,child2创建事件,child3处理事件并更新Event和基础对象。 parent用于将tge数据持久保存到磁盘并更新UI。消除使用child3的线程可以解决问题,但我不相信这不是时间问题。

    为什么会发生这种情况?

    修改

    我想我找到了问题的根源。现在正在寻找解决方案。

    child3更新了Event并尝试将更改保存到parent,而child2决定删除Event并已保存此更改。保存是尝试更新不存在的对象。奇怪的是,只有在我尝试将parent保存到PSC时才会出现错误。

1 个答案:

答案 0 :(得分:0)

我对错误消息的看法是一样的,在我的情况下,问题在于存储对临时(不是永久性的,在保存上下文后生成)ObjectID的引用,试图从另一个上下文中获取对象(objectWithID: )使用id然后对此对象执行更改。保存方法给了我相同的结果。

您是否有机会通过引用ObjectID来访问上下文之间的对象?