核心数据:何时何地首先加载实体?
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:
,以便在首次打开文档时获取和修改所有对象。或者,您可以覆盖窗口控制器的 windowWillLoad
或 showWindow
方法。
不管你在哪里做,你必须获取所有你想修改的托管对象。您可以以编程方式创建一个数组控制器来执行此操作,但如果您有大量对象要修改,则获取请求更容易进行微管理。
【讨论】:
非常感谢!我现在认识到我需要自己事先获取需要修改的托管对象。这正是我想知道的,现在它对我有用!谢谢。【参考方案2】:您可以尝试观察控制器的“arrangedObjects”键路径并添加一些逻辑以使您的数组控制器首次被填充。
另一个可能的钩子是实现托管对象的 awakeFromInsert/awakeFromFetch 方法。
【讨论】:
以上是关于核心数据:何时何地首先加载实体?的主要内容,如果未能解决你的问题,请参考以下文章