0

我有一个关于核心数据的问题。启动我的应用程序时,我的数据(由 Core Data 自动存储)何时加载到 NSArrayControllers 中?我想首先修改它,然后用户才能与之交互。

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

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

感谢您的帮助。

4

2 回答 2

1

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

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

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

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

于 2010-08-04T11:35:32.523 回答
0

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

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

于 2010-08-04T10:33:52.057 回答