延迟获取和维护排序的 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的主要内容,如果未能解决你的问题,请参考以下文章

jQueryUI 可排序允许滚动并为移动设备添加延迟

在 Swift 中对声音进行延迟排序

mongodb副本集维护

PHP:如何排序和维护密钥?

[HDOJ4578]Transformation(线段树,多延迟标记)

能否用linq对数据库执行排序维护?