gpt4 book ai didi

cocoa - KVO问题 "Cannot remove an observer"

转载 作者:行者123 更新时间:2023-12-03 16:55:59 26 4
gpt4 key购买 nike

我有一个链接到核心数据对象的 NSArrayController,设置为“自动重新排列内容”并按谓词进行过滤。一切都很好,直到我尝试取消一个关系并分配另一个关系。此时,我的应用程序崩溃并收到以下错误:

Cannot remove an observer for the key path "career.type" from Object, most likely because the value for the key "career" has changed without an appropriate KVO notification being sent. Check the KVO-compliance of the Person class.

通过观察,似乎将我的 NSArrayController 设置为“自动重新排列内容”会导致此问题。但我试图解决问题,而不必手动重新排列 NSArrayController。这是触发错误的伪代码:

object.career = nil;
object.field = (Field *)item;

这是我的 NSArrayController 正在使用的谓词:

(career != NIL && career == %@) || (field != NIL && field == %@)

其中两个实例的 %@ 都是 CoreData 对象。

基本上,看起来 NSArrayController 为 object.career.type 设置了一个观察者,并且当该观察者被自动删除时,使关系无效会导致问题。所以我想知道我是否以错误的方式处理这个问题?我是否应该获取该对象的副本,从 MOC 中删除它并重新插入它,并将职业设置为 nil 并相应地设置字段?

如何正确通知观察者类型已无效?请注意,此处提到的所有属性和关系都使用符合 KVO 标准的 getter/setter。

最佳答案

From apples documentation

故障和 KVO 通知

当 Core Data 将对象变成故障时,会发送对象属性的键值观察 (KVO) 更改通知(请参阅键值观察编程指南)。如果您正在观察变成故障的对象的属性,并且该故障随后被实现,您将收到其值实际上未更改的属性的更改通知。

尽管从您的角度来看,这些值在语义上没有发生变化,但内存中的文字字节随着对象的具体化而发生变化。从指针比较的角度考虑,键值观察机制要求Core Data在值发生变化时发出通知。 KVO 需要这些通知来跟踪关键路径和依赖对象之间的更改。

<小时/>

所以基本上你会收到一条通知,告诉你有变化,即使没有。所以你必须检查该对象是否已成为故障。然后删除旧的观察者并将新的观察者添加到同一路径...

对我来说这有效(示例代码):

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

if ([keyPath isEqualToString:@"pageIndex"]) {

// basically remove the observer from the fault object and assign the new
if([object isFault]) {
[object removeObserver:self forKeyPath:@"pageIndex"];
[the_current_instance_returned_by_core_data addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionOld context:NULL];
}

// do whatever you want to do on change...

}
}

关于cocoa - KVO问题 "Cannot remove an observer",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3354376/

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