我可以在应用程序中拥有多个独立的CoreData堆栈吗?

时间:2013-04-12 18:01:24

标签: ios objective-c xcode core-data

我最初认为我的问题的答案是一个简单的“是”,但我之后所做的一些阅读让我再次看到了这个问题。

我的目的是使用模块化代码,它允许我从许多代码部分中选择以向应用添加各种功能。例如,我可能有一个允许安全浏览的浏览器组件,一个用于调查用户调查的调查组件,以及一个应用程序主要目的的“核心”组件 - 显示菜单或显示地图一个位置。

我希望每个独立模块都拥有自己的CoreData堆栈。除了应用程序本身调解的任何内容之外,它们不以任何方式相互交谈或相互干扰(使用委托模型与应用程序进行通信)。浏览器的书签列表和列入白名单的站点与调查的调查数据列表是分开的,调查数据列表也完全独立于应用程序的“核心”。如果他们需要彼此交谈,他们可以通过委托调用来完成,其中包括告诉应用程序“我需要一个浏览器来显示X页面”,“显示带有此ID的调查”,或者最后“我是完成后,返回主应用程序“。

在这条道路上开始的是我意识到无法确定给定的NSManagedObjectContextDidSaveNotification是否属于给定的核心数据堆栈。并且,大概是,在mergeChangesFromContextDidSaveNotification:方法中给MOC提供来自不同核心数据堆栈的通知将是一个坏主意。 (我也担心当你尝试将MOC自己的通知反馈给它时会发生什么,但这是我可以轻松尝试的东西)

2 个答案:

答案 0 :(得分:4)

您可以(并且在NSManagedObjectContext文档中明确建议这样做) 注册来自特定环境的变更:

[[NSNotificationCenter defaultCenter] addObserver:self
                           selector:@selector(<#Selector name#>)
                               name:NSManagedObjectContextDidSaveNotification
                             object:<#A managed object context#>];

当您收到此类通知时,通知对象是托管对象上下文。因此,可以在每个组件中创建独立的组件 组件使用自己的核心数据堆栈。

答案 1 :(得分:1)

正如Martin R所说,您可以注册来自特定背景的通知。如果您正在侦听来自多个上下文的通知,则还可以询问通知哪个上下文发布它并基于此继续。使用NSManagedObjectContextDidSaveNotification,查看[notification object]以找出发布它的上下文。

将对象保存在完全不同的堆栈中,使用单独的持久存储,似乎过多,除非存在某种与安全相关的问题。也许,由于某些原因,一个数据集合永远不会被允许接近其他集合是非常重要的。如上所述,该应用程序似乎没有任何令人信服的理由来增加复杂性。

您可能会发现最好使用一个堆栈和一个持久性存储,但具有多个配置。每个配置都包含数据模型中的特定实体。您将拥有一个持久性存储和一个NSManagedObjectModel实例,但有多个NSPersistentStoreCoordinator个实例。在调用addPersistentStoreWithType:configuration:URL:options:error:时指出您想要的配置。