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

Ios 我可以在一个应用程序中拥有多个独立的CoreData堆栈吗?,ios,objective-c,xcode,core-data,Ios,Objective C,Xcode,Core Data,我原本以为我的问题的答案是一个简单的“是”,但后来我做的一些阅读让我再次审视这个问题 我的意图是使用模块化代码,这让我可以从许多代码部分中进行选择,以向应用程序添加各种功能。例如,我可能有一个允许安全浏览的浏览器组件,一个用于进行用户调查的调查组件,以及一个作为应用程序主要用途的“核心”组件——无论是显示菜单还是显示位置地图 我希望每个独立模块都有自己的CoreData堆栈。他们不以任何方式相互交谈或干扰,除了应用程序本身所介导的任何事情(使用委托模型与应用程序进行通信)。浏览器的书签和白名单网

我原本以为我的问题的答案是一个简单的“是”,但后来我做的一些阅读让我再次审视这个问题

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

我希望每个独立模块都有自己的CoreData堆栈。他们不以任何方式相互交谈或干扰,除了应用程序本身所介导的任何事情(使用委托模型与应用程序进行通信)。浏览器的书签和白名单网站列表与调查数据列表是分开的,调查数据列表也与应用程序的“核心”功能完全分开。如果他们需要相互交谈,他们可以通过代表电话进行交谈,包括告诉应用程序“我需要一个浏览器来显示X页面”、“显示带有此id的调查”或最后“我完成了,返回主应用程序”

让我开始走这条路的是,我意识到无法确定给定的NSManagedObjectContextDidSaveNotification是否属于给定的核心数据堆栈。而且,假设在mergeChangesFromContextDidSaveNotification:方法中为MOC提供来自不同核心数据堆栈的通知是个坏主意。(我还担心当您尝试将主运行中心自己的通知反馈回主运行中心时会发生什么情况,但这是我可以很容易尝试的)

您可以(这在NSManagedObjectContext文档中明确建议) 注册来自特定上下文的更改:

[[NSNotificationCenter defaultCenter] addObserver:self
                           selector:@selector(<#Selector name#>)
                               name:NSManagedObjectContextDidSaveNotification
                             object:<#A managed object context#>];
[[NSNotificationCenter defaultCenter]添加观察者:self
选择器:@selector()
名称:NSManagedObjectContextDidSaveNotification
对象:;
当您收到这样的通知时,通知对象就是托管对象上下文。因此,可以创建独立的组件,其中每个组件 组件使用自己的核心数据堆栈。

您可以(NSManagedObjectContext文档中明确建议这样做) 注册来自特定上下文的更改:

[[NSNotificationCenter defaultCenter] addObserver:self
                           selector:@selector(<#Selector name#>)
                               name:NSManagedObjectContextDidSaveNotification
                             object:<#A managed object context#>];
[[NSNotificationCenter defaultCenter]添加观察者:self
选择器:@selector()
名称:NSManagedObjectContextDidSaveNotification
对象:;
当您收到这样的通知时,通知对象就是托管对象上下文。因此,可以创建独立的组件,其中每个组件
组件使用自己的核心数据堆栈。

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

除非存在某种与安全相关的问题,否则将对象保存在完全不同的堆栈中,并使用单独的持久性存储似乎是过度的。比如,出于某种原因,不允许一个数据集靠近另一个数据集是非常重要的。如上所述,该应用程序似乎没有任何令人信服的理由来解释额外的复杂性


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

时,请指明所需的配置。如Martin R所述,您可以注册特定上下文中的通知。如果您正在侦听来自多个上下文的通知,还可以询问该通知是哪个上下文发布的,并基于此继续。使用
NSManagedObjectContextDidSaveNotification
,查看
[notification object]
,找出发布它的上下文

除非存在某种与安全相关的问题,否则将对象保存在完全不同的堆栈中,并使用单独的持久性存储似乎是过度的。比如,出于某种原因,不允许一个数据集靠近另一个数据集是非常重要的。如上所述,该应用程序似乎没有任何令人信服的理由来解释额外的复杂性


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

时,指出您想要的配置。单独堆栈的目的只是通过手动合并每个应用程序的模型来避免额外的工作,它还允许我相对轻松地更新模块的模型,因为我可以在一个地方更改它们,并让git子模块处理这些更改。我必须仔细阅读通过配置来完成这项工作。单独堆栈的目的只是为了避免额外的工作,尝试手动合并每个应用程序的模型——它还允许我相对轻松地更新模块的模型,因为我可以在一个地方更改它们,并让git