观察 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 属性的变化:如何避免循环?的主要内容,如果未能解决你的问题,请参考以下文章