我有一个示例项目
https://github.com/ericgorr/LazyFetching
设置非常简单。在我的 CoreData 模型中,我有两个实体:
- 具有 name 属性和与 Item 实体的一对多关系(项目)的 Shelf
- 具有 name 属性的项目与 Shelf 实体有关系(它是“父级”)
然后我有两个 NSArrayControllers:
模式为“实体名称”的货架阵列控制器,实体名称为“货架”。它准备内容并使用延迟获取。
模式为“实体名称”的项目数组控制器,实体名称为“项目”。它不准备内容,也不使用延迟获取。它的内容集绑定到货架阵列控制器的选择和“项目”属性。
在 Window 上,我有两个 NSTableView 和两个 + 按钮,每个按钮都与一个数组控制器相关联。
我所做的是:
- 按顶部的 + 按钮并将新的货架条目命名为“a”
- 再次按下顶部的 + 按钮并将货架条目命名为“b”
- 按顶部的列标题以升序对货架条目进行排序。
- 确保选择了“b”条目
- 按底部 + 按钮并将 Item 条目重命名为任何内容
然后我看到的是上部(货架)表中的行更改顺序,以便首先列出“b”条目。
如果我按下信息按钮,它会做的是:
- NSLog 货架阵列控制器的排序描述符
- 打印 Shelf Array Controller 的 mappedObjects 数组中的条目名称
- 在货架阵列控制器上调用重新排列对象
- 打印出Shelf Array Controller的arrangedObjects数组中的条目名称
在这一切之后,正如预期的那样,我在 Shelf Array 控制器上看到了一个排序描述符:名称、升序、比较:
以及排列对象的以下输出:
2013-05-19 16:08:56.023 LazyFetching[11791:303] b
2013-05-19 16:08:56.024 LazyFetching[11791:303]
和
2013-05-19 16:08:56.024 LazyFetching[11791:303] b
2013-05-19 16:08:56.024 LazyFetching[11791:303]
由于某种原因,它不再对货架阵列控制器中的项目进行排序。
如果我为 Shelf Array 控制器关闭 Lazy Fetching,一切似乎都正常工作。
所以,我不明白为什么我会在启用延迟获取的情况下看到这种行为。这似乎是一个错误。如果是这样,我当然可以提交可能是重复的报告。但是,我猜,有一些很好的解释和处理它的标准方法,因此项目仍然按数组控制器的排列对象数组中的排序描述符排序。