许多人可能知道,绑定到大纲视图的 NSTreeController 可以在呈现核心数据实体时显示重复项。
一个临时解决方案是在谓词中添加 'parent == nil',但这只会返回父实体。例如,如果用户正在搜索子实体,则不会显示请求的子实体。
一个(提议的)解决方案是继承 NSTreeController 并添加一个 NSMutableSet 变量,它跟踪当前正在显示的实体。这个变量应该在 init 上分配,并在 dealloc 上释放。
当调用“fetchWithRequest:merge:error:”时,该集合应该被清空(我不确定这是否比释放它并再次分配它更有效)。每次要添加实体以显示时,请检查集合是否包含它。如果没有,请添加它。否则,找到更接近根(即子实体)的位置,如果是子实体则跳过它,或者将其与先前包含的交换。
我认为对性能的影响应该相对较小(考虑到 NSSet 使用散列)。我遇到的问题是找到正确的方法来覆盖以添加此行为。具体来说,NSTreeController 在调用“fetchWithRequest:merge:error:”之后处理获取的实体。