gpt4 book ai didi

cocoa - 观察值ForKeyPath :ofObject:change:context: doesn't work properly with arrays

转载 作者:行者123 更新时间:2023-12-03 18:07:10 25 4
gpt4 key购买 nike

我有一个对象,它实现了名为 contents 的键的索引访问器方法。在这些访问器中,当我修改底层数组时,我会调用 willChange:valuesAtIndexes:forKey:didChange:valuesAtIndexes:forKey:

我还有一个自定义 View 对象,它通过 NSArrayController 绑定(bind)到 contents。在 observeValueForKeyPath:ofObject:change:context: 中,我见过的 NSKeyValueChangeKindKey 更改字典中的唯一值是 NSKeyValueChangeSetting。当我向数组添加对象时,我希望看到 NSKeyValueChangeInsertion

每次插入单个项目时,重新创建 View 所观察到的对象的内部表示(尤其是当我批量加载数百个项目时),正如您所想象的那样,会带来相当大的性能问题。我做错了什么,Cocoa 似乎认为我每次添加或删除单个项目时都设置一个全新的数组?

最佳答案

(所有读者请注意:我也讨厌使用答案,但这个讨论太长,无法发表评论。当然,缺点是它最终没有按时间顺序排序。如果你不喜欢它,我建议您向 Stack Overflow 管理员投诉评论长度有限且仅限纯文本。)

I don't understand what you mean by implementing array accessors in the view.

为作为绑定(bind)公开的可变数组属性实现访问器,包括索引访问器。

Bindings is built on top of KVO.

还有 KVC。

All bindings are implemented using observeValueForKeyPath:

当然,覆盖这一点是一种方法。另一种方法是在具有可绑定(bind)属性( View )的对象中实现访问器。

My custom view provides a binding that the app binds to an array -- or in this case, an array controller. Accessor methods apply to KVC, not KVO.

Cocoa Bindings 将为您调用 View 的访问器(大概使用 KVC)。您不需要实现 KVO 观察方法(当然,除非您直接使用 KVO)。

我知道这一点,因为我就是这么做的。请参阅 CPU Usage 中的 PRHGradientView .

奇怪的是,文档没有提到这一点。我将提交一个有关它的文档错误 - 要么我正在做一些脆弱的事情,要么他们忘记在文档中提及这个非常好的功能。

It absolutely matters that I'm getting a set message on every array update. I wouldn't have posted it as a question if it didn't matter.

有相当多的人从事所谓的“过早优化”。如果不问,我无法知道谁是其中之一。

关于cocoa - 观察值ForKeyPath :ofObject:change:context: doesn't work properly with arrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/549397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com