懒惰的抚养&维护已排序的NSArrayController

时间:2013-05-23 00:43:01

标签: cocoa core-data nsarraycontroller

我在

有一个示例项目

https://github.com/ericgorr/LazyFetching

设置非常简单。在我的CoreData模型中,我有两个实体:

  1. 具有名称属性和与Item实体的多对多关系(项目)的货架
  2. 具有name属性的项目与Shelf实体(它是“parent”)
  3. 有关系

    然后我有两个NSArrayControllers:

    具有模式'实体名称'的架子阵列控制器,实体名称'架子'。它准备内容并使用懒惰的提取。

    项目阵列控制器,具有模式'实体名称',实体名称'项目'。它不准备内容,也不使用延迟抓取。它的内容集绑定到Shelf Array Controller的选择和'items'属性。

    在Window上,我有两个NSTableViews和两个+按钮,每个按钮与一个阵列控制器相连。

    我做的是:

    1. 按顶部+按钮并将新的货架条目命名为“a”
    2. 再次按顶部+按钮并将货架条目命名为“b”
    3. 按下顶部列标题以按升序对Shelf条目进行排序。
    4. 确保选中“b”条目
    5. 按下底部+按钮并将项目条目重命名为任何内容
    6. 然后我看到的是上层(货架)表变更单的行,以便首先列出'b'条目。

      如果我按下信息按钮,它会做的是:

      1. NSLog Shelf Array Controller的排序描述符
      2. 在Shelf阵列控制器的arrangeObjects数组中打印条目的名称
      3. 调用Shelf Array Controller上的rearrangeObjects
      4. 打印出Shelf Array Controller的arrangeObjects数组中的条目名称
      5. 在所有这些之后,我按预期看到了Shelf Array Controller上的单个排序描述符:name,ascending,compare:

        以下是arrangeObjects的输出:

        2013-05-19 16:08:56.023 LazyFetching [11791:303] b

        2013-05-19 16:08:56.024 LazyFetching [11791:303] a

        2013-05-19 16:08:56.024 LazyFetching [11791:303] b

        2013-05-19 16:08:56.024 LazyFetching [11791:303] a

        由于某种原因,它不再对Shelf Array Controller中的项进行排序。

        如果我为Shelf Array Controller关闭Lazy Fetching,一切似乎都能正常工作。

        所以,我不明白为什么我看到启用了Lazy Fetching的这种行为。它似乎有可能是一个bug。如果是这样,我当然可以提交可能是重复报告的内容。但是,我猜,有一些很好的解释和处理它的标准方法,所以项目仍然按照数组控制器的arrangeObjects数组中的排序描述符进行排序。

1 个答案:

答案 0 :(得分:0)

我发现在打开延迟抓取NSArrayController(在IB中)之后我唯一可以强制排序的方法是在awakeFromNib中发送一个performSelector:withObject:afterDelay:延迟设置为0:

  • (void)awakeFromNib { [self performSelector:@selector(sort)withObject:self afterDelay:0.0]; }

  • (void)排序{

    NSSortDescriptor * sorting = [NSSortDescriptor sortDescriptorWithKey:@“”                                                        升序:YES];

    [self.AC_Controller setSortDescriptors:[NSArray arrayWithObject:sorting]]; }

这些方法包含在我的主窗口控制器中,NSArrayController驻留在关联的nib文件中。

  • 似乎在加载包含NSArrayController的nib时,nib加载机制根据IB设置调用延迟提取,但这会覆盖您可能尝试以编程方式设置或通过NSTableView中的IB设置的任何排序 - 等待下一个运行循环排序将“接受”确定。

此代码假设您当然有一个连接到NSArrayController的IBOutlet。