6

在我的应用程序中,我有UITableViewController显示事件列表。此控制器使用 ManagedObjectContext Say ParentContext。现在,如果选择了任何事件,则会显示一个详细的视图控制器,用户可以在其中编辑事件的详细信息。所以我创建了一个子上下文说,

ChildContext with type "NSPrivateQueueConcurrencyType"

ChildContext whose parent Context is "ParentContext".

我的代码是:

  NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
  childContext.parentContext = self.context ;

现在又有一些领域和关系需要再次深入研究。所以我为新的视图控制器创建了另一个 ChildContext 说,

GrandChildContext with type "NSPrivateQueueConcurrencyType"

GrandChildContext whose parent context is "ChildContext"

此过程进行到另一个级别(从父级(tableView)到子级总共 4 个级别)

self.context - Parent Context
  |
  |
ChildContext
  |
  |
GrandChildContext
  |
  |
GrandGrandChildContext

我的实体看起来像这样

EntityA           -- ( Edit View Controller  - uses ChildContext )
 |
 |- Field1
 |
 |- Field2
 |
 |- RelationShip (1 to Many ) - ( Relationship Add / Edit View Controller - uses GrandChildContext )
     |
     |- Field1
     |    .
     |    .
     |- Field3
     |
     |- Relationship ( 1 to Many ) - ( Relationship Add / Edit View Controller - uses GrandGrandChildContext )
            |
            |- Field1
            |
            |- Field2

这是使用父子上下文的正确方法吗?因为在某个时候我会喜欢1 NSMainQueueConcurrencyType MOC and 3 NSPrivateQueueConcurrencyType MOC

如果不是?还有其他方法吗?

太多的子上下文会影响应用程序的性能吗?

最初我使用 Properties 和 NSArrays 来管理用户输入的数据,当用户点击完成按钮时,我将更新/创建托管对象。但这是一项乏味的工作,它让我的视图控制器变脏了。所以我切换到父子上下文,这很容易保存/丢弃更新。

谢谢

4

2 回答 2

4

您可能对多个子上下文有些过分,但只是一点点,而且您的一般方法是合理的。MOC(托管对象上下文)是一个相当轻量级的对象。

我喜欢你在每个视图控制器/场景中对适用于该场景的 MOC 有一个不同的引用的方法。

有时将 MOC 视为会话或暂存器会很有帮助。匹配不是在 MOC 和实体之间,而是在 MOC 和逻辑工作单元之间。

如果您的其中一个向下钻取标记了用户可能想要放弃/取消的某些编辑任务的开始,那么这是剥离子 MOC 并将其传递到新视图的好时机。如果需要,您可以回滚:甚至在您放松回到起点时放弃 MOC。

另一方面,如果您只是为静态信息编写一个查看器,则只使用一个 MOC。在这种情况下,没有必要或受益于使用更多。

于 2013-03-02T01:53:54.680 回答
-1

也许对于嵌套托管对象上下文的最佳用例存在一些混淆。对于您的情况,我建议仅使用一个上下文。

从数组等迁移到 Core Data 是一个非常好的主意。现在释放对象图的真正力量和简单性。尽量保持简单。

为了向下钻取,只需将上下文传递给子视图控制器。您的子视图控制器获取结果控制器可以使用与父视图控制器相同的上下文。许多 Apple 代码示例正是使用这种模式。

您需要上下文的唯一时间是您确实需要并发性。这似乎根本不是这种情况。检索到数据后,将显示子视图控制器的新界面。如果这需要太长时间(例如,因为数据来自 Web 服务),您会显示某种“请稍候”界面,并在数据检索完成后显示完整的界面。这很可能不是您的情况。

于 2013-02-22T17:37:37.753 回答