编辑/创建新对象(iPhone)时NSManagedObjectContext的正确用法是什么?

时间:2009-12-01 04:29:51

标签: iphone core-data

我正在尝试找出在查看,编辑和创建NSManagedObjects时使用NSManagedObjectContexts的正确方法。我觉得文档和示例已经解释了如何在最基本的情况下使用它们,但我不确定在稍微复杂的设置中适当的方法是什么。

设置:

  • 3个主屏幕:对象列表,编辑对象屏幕和新对象屏幕。
  • 另一个主题是下载要添加到后台列表中的对象。

要求:

  • 列表屏幕使用MOC和NSFetchedResultsController来获取它的所有对象。
  • 编辑和新对象屏幕使用MOC保存/删除对象,并使用NSFetchedResultsControllers建立关系。
  • 下载的对象需要MOC将其对象保存到Core Data中(在主线程上)。

问题:

  • 我需要多少个MOC?
  • 我该如何操纵这些MOC?

可能的答案:

  • 让一个“查看”MOC从未编辑过,并在列表屏幕中使用。使用单独的MOC进行编辑,新对象屏幕和下载。当这些MOC保存时,将更改合并回“查看”MOC。这样,任何更改都不会影响“查看”MOC,直到它们被保存。这就是我一直在做的事情;它似乎并没有像我希望的那样顺利。编辑和查看之间存在脱节,而不是在我知道它们可能发生更改时能够检查事物我必须等待NSFetchedResultsController委托方法完成并检查可能已更改的每个可能的事情。如果我需要在列表视图中更改某些数据,这也很困难。

  • 为一切提供一个MOC。这是我第一次尝试,但不知道如何处理编辑和创建。现在我了解了一点,我想我可以编辑对象或创建一个对象,并在取消时rollBack。在cimgf上,我看到一个看似相似的post,表示在编辑/创建时创建一个undoGrouping,在取消时创建undo。然后我想我可以在下载的对象上使用单独的MOC,因为它可能在用户在主MOC中编辑时完成并保存。

  • 无论如何,重点是我不知道正确的方法是什么。你能帮帮我吗?

第一个可能的答案的示例断开

  1. 在编辑moc中创建了一个对象(1)。保存。通过通知与视图moc合并。
  2. 创建了一个新的moc,因为我在后台下载对象。更新了与​​(1)相关的一些对象。保存。通过通知与视图moc合并。
  3. 编辑moc中的编辑(1)。保存。通过通知与视图moc合并。
  4. 问题:因为编辑moc从未获得新的moc更改,所以当它保​​存时,它会删除受其影响的所有新moc更改。
  5. 解决方案:我意识到我还可以将更改合并到编辑模式或总是使用新的moc来编辑内容。但是,我一直在遇到像这样的小事情,不得不寻找解决方案,所以让我相信这不是最好的答案。

1 个答案:

答案 0 :(得分:2)

每个线程应该至少有一个MOC(它们不是线程安全的)。因此,您可以为下载程序(在后台线程中)创建一个MOC,为主线程列表中的活动创建另一个MOC,编辑和新建。

当你说断开连接时,你能更具体一点吗?您是否在收到通知时使用通知(NSManagedObjectContextDidSaveNotification)并执行mergeChangesFromContextDidSaveNotification。请记住,mergeChangesFromContextDidSaveNotification应该在主线程上执行。

NSFectchedResultsController的视图控制器中,您是否正确处理了NSFetchedResultsControllerDelegate的所有情况?

相关问题