核心数据:首先加载实体的时间和地点?

时间:2010-08-04 08:26:45

标签: objective-c core-data entity save nsarraycontroller

我对Core Data有疑问。在开始我的应用程序时,我的数据(由Core Data自动存储)何时加载到NSArrayControllers中?我希望在用户可以与之交互之前先修改它。

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

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

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

如果要在UI显示之前修改现有商店,则需要在UI使用的阵列控制器初始化之前处理数据。如果您使用的是NSPersistentDocument,则可以覆盖readFromURL:ofType:error:以在首次打开文档时获取并修改所有对象。或者,您可以覆盖窗口控制器的windowWillLoadshowWindow方法。

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

答案 1 :(得分:0)

您可以尝试观察控制器的“arrangeObjects”键路径,并添加一些逻辑,以便第一次填充阵列控制器。

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