2013-04-12 30 views
0

我原本以为我的问题的答案是一个简单的'是',但是自从我做了一些阅读之后,我又一次看到了这个问题。我可以在应用程序中有多个独立的CoreData堆栈吗?

我的意图是使用模块化代码,它允许我从多个代码段中进行选择以向应用程序添加各种功能。举个例子,我可能有一个允许安全浏览的浏览器组件,一个调查组件来接受用户调查,还有一个“核心”组件是应用程序的主要用途 - 无论是显示菜单还是显示地图的位置。

我想让每个独立模块拥有自己的CoreData堆栈。除了应用程序本身介导的任何内容(使用委托模型完成的应用程序通信)之外,它们不以任何方式彼此对话或互相干扰。浏览器的书签列表和白名单网站与调查的调查数据列表不同,它与应用程序的“核心”功能完全分离。如果他们需要彼此交谈,他们可以通过委托调用来实现,这包括告诉应用程序'我需要一个浏览器来显示X页面','用这个ID显示调查',或者最后是“我是完成后,返回到主应用程序“。

我开始意识到没有办法确定给定的NSManagedObjectContextDidSaveNotification是否属于给定的核心数据堆栈。并且,可能的是,在mergeChangesFromContextDidSaveNotification:方法中向MOC提供来自不同核心数据堆栈的通知将是一个坏主意。 (我还担心当您尝试喂MOC自己的通知回它会发生什么,但是这件事情我可以很轻松地实验)

回答

4

你可以(而且这是的NSManagedObjectContext文档中明确建议) 寄存器从具体的上下文来变化:

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

,当你收到这样的通知,该通知的对象是被管理的对象上下文。因此可以创建独立的组件,其中每个组件使用其自己的核心数据堆栈。

1

正如Martin R指出的那样,您可以注册来自特定环境的通知。如果您正在侦听来自多个上下文的通知,还可以通知通知哪个上下文发布了该通知并基于此通知进行通知。用NSManagedObjectContextDidSaveNotification,看看[notification object]找出发布它的上下文。

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

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

+0

单独堆栈的目的是为了避免额外的工作,试图手动合并每个应用程序的模型 - 它还允许我相对容易地更新模块的模型,因为我可以在一个地方更改它们让git Submodules处理拉动变化。我将不得不通过配置来阅读。 – RonLugge

相关问题