【发布时间】:2010-07-03 00:50:46
【问题描述】:
许多人可能都知道,绑定到大纲视图的 NSTreeController 可以在呈现核心数据实体的同时显示重复项。
临时解决方案是在谓词中添加“parent == nil”,但这只会返回父实体。例如,如果用户正在搜索子实体,则不会显示请求的子实体。
一个(建议的)解决方案是继承 NSTreeController 并添加一个 NSMutableSet 变量,它跟踪当前正在显示的实体。此变量应在 init 时分配,并在 dealloc 时释放。
当调用“fetchWithRequest:merge:error:”时,该集合应该被清空(我不确定这是否比释放它并再次分配它更有效)。每次要添加实体以显示时,请检查集合是否包含它。如果没有,请添加它。否则,找到更接近根(即子实体)的位置,如果是子实体则跳过它,或者与之前包含的交换它。
我认为对性能的影响应该相对较小(考虑到 NSSet 使用散列)。我遇到的问题是找到正确的方法来覆盖以添加此行为。具体来说,NSTreeController 在调用“fetchWithRequest:merge:error:”之后处理获取的实体。
【问题讨论】:
-
您可能需要使用适当的术语重新表述。 “实体”和“实体的实例”是两个不同的东西。我认为您的意思是“与自身具有父/子关系的实体的实例”。但是,您对“子实体”的使用听起来像是“从父实体继承属性/关系的实体”,在这里没有多大意义。
-
抱歉不清楚。子实体是指一个实体的实例,它是另一个实体实例的子实体(正如您描述的关系)。
标签: objective-c cocoa core-data nsoutlineview nstreecontroller