gpt4 book ai didi

macos - 如何在 OSX 应用程序中将 CoreData 管理与 AppDelegate 分开

转载 作者:行者123 更新时间:2023-12-03 16:47:04 28 4
gpt4 key购买 nike

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

this Question ,讨论是否将 CoreData 处理与 AppDelegate 分开。我决定尝试关注点分离的方式。

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

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

我目前的状态是这样的:

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

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

  • 我将所有 CoreData-Stack 相关方法从 AppDelegate 移至 DataController
  • 我将 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 中添加和删除对象,撤消和重做也可以。但是,“文件保存”菜单项呈灰色,当我点击 cmd+s 时,我会从操作系统中收到 bing 。 (当我在 AppDelegate 中拥有 CoreData 堆栈时,这曾经“神奇地”工作。)

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

  1. 隐藏在 CoreData 模板中的什么神奇胶水代码可以使 cmd+ 起作用并启用“文件 - 保存”菜单项?
  2. 什么隐藏代码会在应用程序启动时将我的 mangedObjectContext 内容恢复到我的 OutlineView

最佳答案

我已经为 iOS 编写了一个框架来执行此操作。我的方法从 AppDelegate 中获取 Core Data 样板代码,并将其移至单例类中。这与 AppDelegate 完全分离,无需在 View Controller 之间传递 NSManagedObjectContext ,并且只需将框架复制到项目中即可将核心数据添加到应用程序中。

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

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

关于macos - 如何在 OSX 应用程序中将 CoreData 管理与 AppDelegate 分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12045560/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com