核心数据关系,多个托管对象上下文&线程

时间:2011-07-14 07:10:46

标签: ios core-data nsmanagedobjectcontext

这有点棘手。

我有Document个实体当前正从后台线程上的SQLite数据库导入到CoreData中。后台线程有一个单独的上下文,我每500个条目批处理一次。

保存后台线程上下文会触发一个通知,该通知会抓取我主线程的上下文并执行两者之间的合并。

如果我只导入document个实体,那么一切都按预期工作。

当我尝试在正在创建的当前document与另一个名为briefcase的实体之间建立关系时,会出现问题。

这就是我的导入例程目前所做的事情:

  • 创建Briefcase实体
  • 循环访问SQLite数据库行并为每行创建Document个实体
  • 创建循环中的文档与公文包实体之间的关系
  • 每500行,我保存&重置上下文。这会触发ContextSave通知,该通知会抓取主线程并与主线程的上下文合并。
  • 这是我的问题:在保存&之后重置上面,我的Briefcase实体与主线程合并,所以当我的循环继续时,创建的下一个文档实体尝试将自己与公文包关联,这是我遇到崩溃的地方,说我不能建立之间的关系单独线程上的对象。

我知道如果我在保存之后删除了重置上下文的调用,一切都按预期工作,但我的内存占用率上升,这不是我准备接受的。

所以我的问题是:

  • 你能想到一种方法来保持整个导入过程的公文包实体(并且有效),以便我可以继续创建关系吗?

  • 我的第一个想法是创建没有上下文的公文包实体,然后在整个过程完成后将其添加到上下文中。这不能很好地工作(它在创作时崩溃了。)

非常感谢您的想法。 ROG

1 个答案:

答案 0 :(得分:1)

回答我自己的问题:

  • 创建公文包实体
  • 遍历SQLite数据库行并为每行创建文档实体
  • 创建循环中的文档与公文包实体之间的关系
  • 每500行,保存上下文&保存后立即存储公文包的objectID
  • 现在可以重置上下文
  • (重新)使用上面保存的objectID和existingObjectWithID:error:method
  • 检索公文包实例
  • 循环继续......