观察 NSManagedObject 属性的变化:如何避免循环?

Posted

技术标签:

【中文标题】观察 NSManagedObject 属性的变化:如何避免循环?【英文标题】:Observing changes in the properties of an NSManagedObject: how to avoid looping? 【发布时间】:2013-06-08 08:20:18 【问题描述】:

在我的应用程序中,我观察托管对象的属性。更改可能会导致其某些其他属性的调整,因此托管对象本身会收到更改属性的消息。这些更改通过在 Interface Builder 中设置的绑定发生。

我在托管对象的实现中有如下方法:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

    if ( !processingChange )
    
        processingChange = YES;

        *** DO STUFF TO THIS MANAGED OBJECT'S PROPERTIES ***

        [self.managedObjectContext processPendingChanges];

        processingChange = NO;
        return;
    

processingChange 布尔值是为了避免无休止的“通知循环”,但它并没有像我预期的那样工作(而且它看起来像一个真正的肮脏黑客)。

必须有另一种方法来做到这一点。有什么建议吗?

【问题讨论】:

【参考方案1】:

使用 MOM 的 setPrimitiveValue:forKey: 它不会生成 KVO

【讨论】:

如果我的托管对象是 EventType,我是否可以在不生成 KVO 消息的情况下将新事件添加到它的一对多关系中? -addEventsObject? 我认为你需要设置底层集合以避免KVO【参考方案2】:

我认为不需要“手动”发送通知,看看:https://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177i

observeValueForKeyPath:ofObject:change:context: 方法是 当观察到的属性的值是自动调用 以符合 KVO 的方式更改,或者如果它依赖的密钥 变了。

也许这就是错误?

【讨论】:

这看起来很有希望,我至少可以说我没有意识到会发生这种情况。也许我打了两次电话-observeValueForKeyPath:。我会看看我是否可以在没有手动通知的情况下调用该方法! 我想我误读了答案,也许我不清楚我的设置方式。我正在观察托管对象的变化,这些变化是通过 Interface Builder 中的绑定发生的。我不会发送手动通知,我会编辑问题以澄清。 抱歉,这有什么关系? @Daij-Djan:查看问题的编辑历史记录(以及提问者对此答案的 cmets)。此答案是针对问题的原始版本编写的。

以上是关于观察 NSManagedObject 属性的变化:如何避免循环?的主要内容,如果未能解决你的问题,请参考以下文章

消失的 NSManagedObject

保存时检测对 NSManagedObject 的更改

Swift:CoreData NSManagedObject 的自定义设置器

跟踪 NSManagedObject 的属性变化

核心数据 - 观察变化并注册本地通知

KVO 方法在 NSManagedObject 属性上触发两次