核心数据:何时何地首先加载实体?

Posted

技术标签:

【中文标题】核心数据:何时何地首先加载实体?【英文标题】:Core Data: When and where are Entities loaded in the first Place? 【发布时间】:2010-08-04 08:26:45 【问题描述】:

我有一个关于核心数据的问题。启动我的应用程序时,我的数据(由 Core Data 自动存储)何时加载到 NSArrayControllers 中?我想在用户与之交互之前先对其进行修改。

更具体地说:我有一个用于实体播放列表的 NSArrayController。在用户可以添加新的播放列表或与应用程序交互之前,我想以编程方式修改播放列表。我在我的 NSPersistentDocument (MyDocument.m) 和 awakeFromNib 中都尝试了 windowControllerDidLoadNib: 在我的 NSPersistendDocument 和 NSArrayController 中,但是当我使用 [[myArrayController arrangedObjects] count] 签入这些方法时,结果为 0(数组控制器的内容为空)。

但是,我实际上存储了数据并显示给用户。我只是不知道何时何地可以修改它。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

数据永远不会“加载”到 NSArrayController 中。阵列控制器本身不是阵列。它不包含或以其他方式存储数据。

相反,数组控制器仅在需要特定数据时才向其绑定的对象查询特定数据。对于 Core Data 尤其如此,其中托管对象仅在访问其属性时才完全实例化。数组控制器将数据从数组类型的数据结构移动到另一个对象(通常是 UI 元素)。

如果您想在 UI 中显示现有存储之前对其进行修改,则需要在 UI 使用的数组控制器甚至初始化之前处理数据。如果您使用NSPersistentDocument,那么您可以覆盖readFromURL:ofType:error:,以便在首次打开文档时获取和修改所有对象。或者,您可以覆盖窗口控制器的 windowWillLoadshowWindow 方法。

不管你在哪里做,你必须获取所有你想修改的托管对象。您可以以编程方式创建一个数组控制器来执行此操作,但如果您有大量对象要修改,则获取请求更容易进行微管理。

【讨论】:

非常感谢!我现在认识到我需要自己事先获取需要修改的托管对象。这正是我想知道的,现在它对我有用!谢谢。【参考方案2】:

您可以尝试观察控制器的“arrangedObjects”键路径并添加一些逻辑以使您的数组控制器首次被填充。

另一个可能的钩子是实现托管对象的 awakeFromInsert/awakeFromFetch 方法。

【讨论】:

以上是关于核心数据:何时何地首先加载实体?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:检测孩子何时被删除

确定核心数据模型何时有新版本

Visual Studio 2017 何时、何地以及如何设置 DOCKER_BUILD_SOURCE 环境变量

核心数据保存和加载到多个实体

何时不使用核心数据关系

NSUndoManager 检测核心数据实体的实际删除