NSTreeController +核心数据:STOP KVO?

时间:2011-08-15 05:36:44

标签: objective-c cocoa core-data key-value-observing

上下文

我的应用程序中有一个非常正常的设置:NSOutlineView(由绑定到Core Data的NSTreeController支持)根据用户在outlineView中选择的内容填充NSTableView(由绑定到核心数据的NSArrayController支持)。两个控制器(及其视图)都以正常方式绑定---> NSArrayController上的contentSet绑定指向由outlineView中所选行表示的对象的NSSet属性。

因此,假设用户在outlineView中选择“Folder X”。 “文件夹X”中有1,200个项目,每个项目都由Core Data实体支持,每个项目都是tableView中的一行。

问题

我的应用程序需要更改这1,200个实体中的每一个的属性,所以我有一个循环来做到这一点。但是,每次我访问实体并设置新属性时,NSTreeController和NSArrayController都会触发KVO通知,并将更改的实体作为通知的对象。这是杀戮表现。

如果在outlineView中未选择任何内容,则循环或多或少立即完成。如果选择“文件夹X”,那些KVO通知会将过程减慢到约8秒。

我需要什么

阻止控制器触发KVO通知的方法,或解决问题的方法,以便在NSController中选择实体时更新实体不会更慢。

1 个答案:

答案 0 :(得分:2)

您可以使用-setPrimitiveValue:forKey:的{​​{1}}方法。这将允许您设置属性的值而不触发KVO观察者。

请注意,通常,您应该使用动态生成的访问器而不是直接使用此方法(例如,NSManagedObject而不是setPrimitiveName:)。