如何存储基于文档的设置?

时间:2016-01-17 05:53:52

标签: swift macos core-data

我有一个Core Data,基于文档,故事板支持的OS X项目。每个文档都有一个特定的日历年和它所在的省/州,所以我创建了一个Settings实体,在创建文档时要求这些值。由于某些行为基于这些设置,因此其他自定义NSManagedObject类需要请求它们,并且每次需要该值时执行NSFetchRequest似乎都是正确的。但是,我不确定在Core Data之外将值复制到何处。

  1. AppDelegate - 据我所知,每个应用程序只有一个,而不是每个文档,所以这不合适。

  2. 文档 - 这似乎是最好的,但我不确定如何在NSManagedObject内部再次找到该文档。我尝试在Document中定义一个var年,然后从NSManagedObject调用theWindow.controller?.document?.year,但如果我自己没有设置它,那么窗口是零。此外,窗口是全局的,在AppDelegate之外,所以即使我确定它(在文件的makeWindowControllers()中由theWindow = windowController.window),它再次成为每个应用程序,所以每次我调用这一行,我发现最后打开的文档的年份(最后一个覆盖窗口),而不是活动文档。我不确定如何找到当前窗口的引用。

  3. 用户默认值 - 再次,这是每个应用程序,而不是每个文档。我当前的解决方案使用这些默认值,然后每次调用windowDidBecomeMain时重新定义默认值(使用NSFetchRequest),因此当前Document将用户默认值设置为其自己的设置。

  4. 我似乎不太可能只想要设置每个文档,但我似乎无法找到任何关于如何/在何处定义这些内容的示例或先前的问题。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

您正在描述每个文档的元数据,幸运的是Core Data支持这种元数据。每个持久性存储文件(NSPersistentDocument使用的)都可以拥有自己的元数据字典,其中包含您需要的任何键和值。它有点像用户默认值,除了它是文档的一部分。此数据是文件的一部分,但与构成实际文档数据的SQLite存储区分开。

元数据API位于NSPersistentStoreCoordinator。您可以通过self.managedObjectContext.persistentStoreCoordinator将协调员放入文档中。有几种方法可以读取和写入文档元数据。将您的年份和省/州保存在元数据中,然后查看并在打开文档时查阅。

Core Data拥有自己不想丢失的元数据 - 因此在编辑元数据时,请确保查找现有元数据,修改元数据并保存新数据。不要只为文档分配一个全新的元数据字典。