如何防止递归KVO通知?

时间:2012-03-15 08:02:49

标签: cocoa events notifications key-value-observing

我在微控制器中为大学课做UI。它是用于控制不同房间温度的温度控制器的用户界面。对于每个房间,我有一个RoomViewController(一个NSViewController子类)的实例,它管理一个相应的视图,显示当前的温度和目标温度,可由用户更改。

我的目的是使用Cocoa绑定将目标临时显示的值绑定到RoomViewController中的属性,然后让另一个类侦听这些属性,以通过串行将这些更新发送到微控制器。问题是,更改也可能来自微控制器,这意味着我必须以编程方式设置属性,因为来自微控制器的事件。这将导致属性更改通知,从而导致更改MCU中的值,这将导致来自MCU的事件,这将导致属性更改等等。它会变成无限循环。

如何在KVO中阻止此类反馈循环?

1 个答案:

答案 0 :(得分:0)

测试(你说这是大学课程!):

a)将属性设置为当前值会导致KVO更改通知吗?

b)如果你没有改变你的财产,如果新的价值相同,那么从MCU收到一个事件会不会影响你的周期?

c)想想你可以做的另一项测试!

评论回复

我假设你已经测试了(a)& (b)并发现他们并不完全符合您的要求。那么也许你所追求的是一个拥有两个二人的单一财产?一个setter触发KVO而另一个没有......

现在你在谈论温度,所以你的财产可能是一些数字类型。它是一个包装数字,如NSNumber,还是原始数字,如double

让我们假设后者,因为前者(更多)涉及更多!

所以:

  1. 您有一个由同一类型的实例变量支持的数字,例如double属性。
  2. @syntheize属性让编译器创建一个setter和一个getter来改变/检索该实例变量中的值。
  3. 您正在使用KVO来获取setter的使用。
  4. 并且您希望能够在不触发KVO的情况下设置属性。
  5. 对于原始数字属性,setter需要做的就是设置实例变量...
  6. 问题解决了。 OK?