【问题标题】:NSTreeController + Core Data: STOP KVO?NSTreeController + 核心数据:停止 KVO?
【发布时间】:2011-10-27 01:55:36
【问题描述】:

上下文

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

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

问题

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

如果在大纲视图中未选择任何内容,则循环或多或少会立即完成。如果选择了“文件夹 X”,这些 KVO 通知会将处理速度减慢到大约 8 秒。

我需要什么

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢罗伯!如果我可以在 Xcode 4 中为您提供正则表达式搜索和替换,我会的。 :)
    • 此外,Xcode 4 中的 NSManagedObject 生成器似乎不会自动添加各种 -setPrimitive[key]: 方法。您必须自己将它们添加到托管对象子类(使用@dynamic)或使用 value:forKey: 方法。
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多