2

如果您对我的故事不感兴趣,请立即跳到底部的两个编号问题。

这个问题中,讨论了是否将 CoreData 处理与 AppDelegate 分开。我决定尝试关注点分离的方式。

由于 Apple 没有为 AppKit 应用程序提供有关该主题的文档,我的问题是:

  • 是否有任何文档、资源甚至示例项目显示如何将 CoreData 堆栈与 AppDelegate 分离?

我现在的状态是这样的:

我有一个AppDelegate和一个DataController,它是一个子类NSTreeControllerDataController控件 aNSOutlineView显示我的CoreData模型的对象(组和叶子)。

CoreData从 Xcode 的(不是基于文档的)模板开始。

  • 我将所有与 CoreData-Stack 相关的方法AppDelegateDataController.
  • 我做了DataController一个单身人士。
  • AppDelegate我将真正的相关方法转发给了DataController这样的:

在 AppController.m 中

- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window{
    return [[[DataController sharedController] managedObjectContext] undoManager];
}
- (IBAction)saveAction:(id)sender{
    [[DataController sharedController] saveAction:sender];
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender{
    return [[DataController sharedController] applicationShouldTerminate:sender];
}
  • 所有那些被调用的方法当然都是在 DataController.m 中实现的

现在我可以在NSOutlineView、undo 和 redo 中添加和删除对象了。但是,文件保存菜单项是灰色的,当我点击 cmd+s 时,我从操作系统中得到了 bing。(当我在 AppDelegate 中拥有 CoreData 堆栈时,这曾经“神奇地”工作。)

当我退出应用程序时,我的对象通过调用OutlineView写入persistentStore(我看到了 xml) 。applicationShouldTerminate但是,当我重新启动应用程序时,对象不会恢复到OutlineView. (当我在 AppDelegate 中拥有 CoreData 堆栈时,这曾经“神奇地”工作。)

  1. 隐藏在CoreData模板中的魔术胶水代码使 cmd+s 工作并启用文件 - 保存菜单项?
  2. 什么隐藏的代码在应用程序启动时将我的内容恢复mangedObjectContext到我的。OutlineView
4

1 回答 1

0

我已经为 iOS 编写了一个框架来执行此操作。我的方法从 AppDelegate 中获取 Core Data 样板代码并将其移动到单例类中。这提供了与 AppDelegate 的清晰分离,消除了NSManagedObjectContext在视图控制器之间传递 a 的需要,并允许您通过将框架复制到项目中来将核心数据添加到应用程序中。

您可以在http://schwiiz.org/?p=1120阅读有关该框架的信息,或从https://github.com/chriscdn/RHManagedObject下载。

该框架不仅仅是一个单例。它还扩展NSManagedObject以简化诸如在不同线程之间保存和获取之类的事情。

于 2012-08-22T06:11:09.333 回答