gpt4 book ai didi

objective-c - 为单个 KVC 更改接收 2 个 KVO 通知

转载 作者:太空狗 更新时间:2023-10-30 03:15:40 25 4
gpt4 key购买 nike

我正在使用 KVC/KVO 为一个大学项目创建一个自定义绑定(bind)实现(它需要自定义,因为我想做超出绑定(bind)所能做的事情,包括在 iOS 上运行)。

我有一个“绑定(bind) Controller ”,它在一个对象的多个键上注册 KVO 通知(使用 addObserver:forKeyPath:options:context:),我确实收到了通知。但是,每次更改我都会收到两个通知。我有一个解决方法的想法,但我更愿意找出发生这种情况的原因并加以纠正!

有没有人知道为什么会发生这种情况?我确定我只为每个通知注册了一次,取消注册一次会导致两个通知都停止。

谢谢。

编辑:

我需要一些代码,所以我会放一些代码。目前有点粗糙,它本质上仍然是一个概念验证,所以请耐心等待。

这是我正在观察的属性之一(我知道这有点奇怪,但是这个类本质上将 NSManagedObject 的某些属性公开为它自身的属性):

- (void)setName:(NSString *)name
{
[self willChangeValueForKey:@"name"];
[contact setFirstName:name];
[self didChangeValueForKey:@"name"];
}

这是我用来观察该属性的代码(确认只运行一次,并且只在一个地方):

[viewModel addObserver:self
forKeyPath:@"name"
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial)
context:viewController];

在此之后更改该属性的任何调用,例如:

viewModel.name = @"Joe";
[viewModel setName: @"Joe"];
[viewModel setValue: @"Joe" forKey: @"name"];

将导致方法:

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

被调用两次,每次都使用相同的参数。

最佳答案

你这样做:

- (void)setName:(NSString *)name
{
[self willChangeValueForKey:@"name"];
[contact setFirstName:name];
[self didChangeValueForKey:@"name"];
}

但是(听起来)来自非 NSManagedObject 子类。这意味着 Cocoa 将尝试自动为您发送 KVO 通知。你也通过发送你自己的来补充这一点。解决方案:

  • 覆盖 +automaticallyNotifiesObserversForKey: 以返回 NO
  • 将您的方法更改为:

    - (void)setName:(NSString *)name
    {
    [联系人设置名字:姓名];
    }

关于objective-c - 为单个 KVC 更改接收 2 个 KVO 通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4451861/

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