Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 观察NSManagedObject属性的变化:如何避免循环?_Cocoa_Core Data_Nsmanagedobjectcontext_Nsnotificationcenter - Fatal编程技术网

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

Cocoa 观察NSManagedObject属性的变化:如何避免循环?,cocoa,core-data,nsmanagedobjectcontext,nsnotificationcenter,Cocoa,Core Data,Nsmanagedobjectcontext,Nsnotificationcenter,在我的应用程序中,我观察托管对象的属性。更改可能会导致对其某些其他属性进行调整,因此托管对象本身会收到更改属性的消息。这些更改是通过在Interface Builder中设置的绑定进行的 在托管对象的实现中,我有以下方法: -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ( !pr

在我的应用程序中,我观察托管对象的属性。更改可能会导致对其某些其他属性进行调整,因此托管对象本身会收到更改属性的消息。这些更改是通过在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
布尔值是为了避免无休止的“通知循环”,但它并没有像我预期的那样工作(而且它看起来像一个真正的肮脏的黑客)


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

我认为没有必要“亲自”发送通知,请看:

对象:更改:上下文:方法的observeValueForKeyPath: 当观察到的属性的值为 以兼容KVO的方式更改,或者如果它所依赖的密钥 改变了


也许这甚至是个错误?

我认为没有必要“亲自”发送通知,请看:

对象:更改:上下文:方法的observeValueForKeyPath: 当观察到的属性的值为 以兼容KVO的方式更改,或者如果它所依赖的密钥 改变了


也许这甚至是个错误?

使用MOMs
setPrimitiveValue:forKey:
它不会生成KVO

使用MOMs
setPrimitiveValue:forKey:
它不会生成KVO

这看起来真的很有希望,至少我还没有意识到这会发生。也许我调用了
-observeValueForKeyPath:
两次。我将看看是否可以在没有手动通知的情况下调用该方法!我想我误读了答案,也许我不清楚我是如何设置的。我观察到托管对象中的更改,这些更改是通过界面生成器中的绑定发生的。我不会发送手动通知,我会编辑问题来澄清。对不起,这有什么关系?@Daij Djan:看看问题的编辑历史(以及提问者对这个答案的评论)。这个答案是为问题的原始版本而写的。这看起来很有希望,至少我可以说我没有意识到这会发生。也许我调用了
-observeValueForKeyPath:
两次。我将看看是否可以在没有手动通知的情况下调用该方法!我想我误读了答案,也许我不清楚我是如何设置的。我观察到托管对象中的更改,这些更改是通过界面生成器中的绑定发生的。我不会发送手动通知,我会编辑问题来澄清。对不起,这有什么关系?@Daij Djan:看看问题的编辑历史(以及提问者对这个答案的评论)。此答案是针对问题的原始版本编写的。如果我的托管对象是EventType,我是否可以在不生成KVO消息的情况下向其多对多关系添加新事件
-addEventsObject
?我认为您需要设置基础集合以避免KVOI如果我的托管对象是EventType,我是否可以在不生成KVO消息的情况下向其对多关系添加新事件
-addEventsObject
?我认为您需要设置基础设置以避免KVO