延迟获取和维护排序的 NSArrayController
Posted
技术标签:
【中文标题】延迟获取和维护排序的 NSArrayController【英文标题】:Lazy Fetching & Maintaining a sorted NSArrayController 【发布时间】:2013-05-23 00:43:00 【问题描述】:我有一个示例项目
https://github.com/ericgorr/LazyFetching
设置非常简单。在我的 CoreData 模型中,我有两个实体:
-
具有 name 属性和与 Item 实体的一对多关系(项目)的货架
具有 name 属性的项目与 Shelf 实体有关系(它是“父级”)
然后我有两个 NSArrayControllers:
模式为“实体名称”的货架阵列控制器,实体名称为“货架”。它准备内容并使用延迟获取。
模式为“实体名称”的项目数组控制器,“项目”的实体名称。它不准备内容,也不使用延迟获取。它的 Content Set 绑定到 Shelf Array Controller 的 selection 和 'items' 属性。
在 Window 上,我有两个 NSTableView 和两个 + 按钮,每个按钮都与一个数组控制器相关联。
我所做的是:
-
按顶部的 + 按钮并将新的书架条目命名为“a”
再次按顶部的 + 按钮并将书架条目命名为“b”
按顶部列标题可按升序对书架条目进行排序。
确保选择了“b”条目
按下底部的 + 按钮并将项目条目重命名为任何内容
然后我看到的是上部(货架)表中的行更改顺序,以便首先列出“b”条目。
如果我按下信息按钮,它会做的是:
-
NSLog 货架阵列控制器的排序描述符
打印Shelf Array控制器的arrangedObjects数组中的条目名称
在货架阵列控制器上调用重新排列对象
打印出Shelf Array控制器的arrangedObjects数组中的条目名称
在这一切之后,正如预期的那样,我在 Shelf Array Controller 上看到了一个排序描述符:名称、升序、比较:
以及排列对象的以下输出:
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 Controller 关闭 Lazy Fetching,一切似乎都正常工作。
所以,我不明白为什么我会在启用延迟获取的情况下看到这种行为。这似乎是一个错误。如果是这样,我当然可以提交可能是重复的报告。但是,我猜,有一些很好的解释和处理它的标准方法,所以项目仍然按数组控制器的排列对象数组中的排序描述符排序。
【问题讨论】:
【参考方案1】:我发现在为 NSArrayController(在 IB 中)打开延迟获取后强制排序的唯一方法是在 awakeFromNib 中发送 performSelector:withObject:afterDelay: 并将延迟设置为 0:
(void)awakeFromNib [self performSelector:@selector(sort) withObject:self afterDelay:0.0];
(void)排序
NSSortDescriptor* 排序 = [NSSortDescriptor sortDescriptorWithKey:@"" 升序:是];
[self.AC_Controller setSortDescriptors:[NSArray arrayWithObject:sorting]];
这些方法包含在我的主窗口控制器中,其中 NSArrayController 驻留在关联的 nib 文件中。
似乎在加载包含 NSArrayController 的 nib 时,nib 加载机制会根据 IB 设置调用延迟获取,但这会覆盖您可能尝试以编程方式或通过 NSTableView 中的 IB 设置的任何排序 - 等待下一个运行循环,然后排序将“接受”确定。此代码当然假设您有一个连接到 NSArrayController 的 IBOutlet。
【讨论】:
以上是关于延迟获取和维护排序的 NSArrayController的主要内容,如果未能解决你的问题,请参考以下文章