我在
有一个示例项目https://github.com/ericgorr/LazyFetching
设置非常简单。在我的CoreData模型中,我有两个实体:
然后我有两个NSArrayControllers:
具有模式'实体名称'的架子阵列控制器,实体名称'架子'。它准备内容并使用懒惰的提取。
项目阵列控制器,具有模式'实体名称',实体名称'项目'。它不准备内容,也不使用延迟抓取。它的内容集绑定到Shelf Array Controller的选择和'items'属性。
在Window上,我有两个NSTableViews和两个+按钮,每个按钮与一个阵列控制器相连。
我做的是:
然后我看到的是上层(货架)表变更单的行,以便首先列出'b'条目。
如果我按下信息按钮,它会做的是:
在所有这些之后,我按预期看到了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数组中的排序描述符进行排序。
答案 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的IBOutlet。