objective-c - NSTreeController + 核心数据 : STOP KVO?

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

上下文

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

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

问题

我的应用程序需要更改这 1,200 个实体中每个实体的属性,因此我有一个循环来执行此操作。但是,每次我访问一个实体并设置一个新属性时,NSTreeController 和 NSArrayController 都会触发 KVO 通知,并将更改的实体作为通知的对象。这是致命的表现。

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

我需要什么

一种阻止 Controller 触发 KVO 通知的方法,或者一种解决该问题的方法,以便在 NSController 中选择实体时更新实体不会变慢。

最佳答案

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

请注意,一般情况下,您应该使用动态生成的访问器,而不是直接使用此方法(例如,setPrimitiveName: 而不是 setPrimitiveValue:newName forKey:@"name")。

关于objective-c - NSTreeController + 核心数据 : STOP KVO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7061986/

相关文章:

objective-c - 命令/Developer/usr/bin/clang 失败,退出代码为 1

iphone - 核心数据获取非常慢

iphone - 无法将对象变成故障(核心数据)

iphone - UITableview 未正确放置在 uiscrollview 中

ios - 当按钮按下两次时,如何使用 NSUSerDefaults 更改颜色

cocoa - Mac 应用程序禁用 Xcode "Build and Archive"按钮。为什么?

cocoa - 核心数据实体中的对象数组?

objective-c - 在 Objective-c 中使用调度队列

iphone - NSFetchRequest 谓词语法

objective-c - SecKeychain加载项