NSArrayController 的自动准备内容和自动重新排列对象有啥用?

Posted

技术标签:

【中文标题】NSArrayController 的自动准备内容和自动重新排列对象有啥用?【英文标题】:what are automaticallyPreparesContent and automaticallyRearrangesObjects of NSArrayController for?NSArrayController 的自动准备内容和自动重新排列对象有什么用? 【发布时间】:2013-11-28 06:25:47 【问题描述】:

我正在使用 cocoa-binding 将NSTableView 绑定到Core Data,如下所示

_arrayController = [[MyArrayController alloc] init];
[_arrayController setEntityName:@"User"];
[_arrayController setManagedObjectContext:self.managedObjectContext];
[_arrayController setUsesLazyFetching:NO];

[self.tableView bind:NSContentBinding toObject:self.arrayController withKeyPath:@"arrangedObjects" options:nil];

[_arrayController fetch:nil];

一切似乎都运行良好。

但我不明白的一件事是NSArrayController 的automaticallyPreparesContentautomaticallyRearrangesObjects 属性的效果。根据文档,默认情况下两者都是NO,我也没有更改它们。 Doc 说

如果标志为 YES 并且设置了托管对象上下文,则使用当前提取谓词从托管对象上下文中提取初始内容。控制器还注册为其托管对象上下文的观察者。然后它使用上下文的通知跟踪其实体的插入和删除,并根据需要更新其内容数组。

我认为这意味着,如果标志为 NO,则内容数组不会使用新插入的对象更新到托管对象上下文。但是当我将新的托管对象插入托管对象上下文时,它会更新。我误会了什么?

而且,关于automaticallyRearrangesObjects Doc 说

设置接收方是否自动重新排列其内容以对应当前的排序描述符和过滤谓词。

这意味着,我认为,如果标志为 NO,即使更改了数组控制器的排序描述符或过滤谓词,内容也不会重新排列。但它是!当我更改过滤谓词或排序描述符时,绑定到数组控制器的表视图上的行会重新排列。

对于 NSArrayController 的行为我不知道或误解了什么,我感到很困惑。

【问题讨论】:

【参考方案1】:

‘automaticallyPreparesContent’决定是否在 CoreData 数据库上自动完成初始获取以填充 arrayController,或者是否必须自己完成。

如果您想在初始提取之前进行特殊提取或在代码中进行一些额外设置,您可以将其关闭。

‘automaticallyRearrangesObjects’决定当你改变对象中的一个值时arrayController是否会重新排序,而不是当你改变排序或过滤器时它是否会重新排序。比如,如果你在“标题”上排序并且你改变了一个对象的标题,你是必须手动告诉 arrayController 更新自己还是自动发生。

如果您有数千行,您可能会关闭后一个,因为在大量项目上设置 KVO 实际上非常慢。

【讨论】:

如果我禁用“准备内容”,我是否需要编写代码或者我仍然可以使用接口构建来获取数据? (在我的例子中,NSArrayController 绑定到 NSComboBoxCell)

以上是关于NSArrayController 的自动准备内容和自动重新排列对象有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

如果 NSArrayController 上的 setFilterPredicate 在“自动重新排列内容”中,它就不起作用

实体模式下的 NSArrayController 在具有内容绑定的 NSTableView 被编辑后未更新

NSArrayController 没有拾取从另一个上下文合并的数据

如何将 NSArrayController 的内容集绑定到多个 NSArrayController 选择?

对支持 CoreData 的 NSArrayController 进行排序时遇到问题

核心数据遍历具有 NSArrayController 内容集的实体?