2012-03-15 55 views
1

我正在为微控制器中的大学课程做UI。它是用于控制不同房间温度的温度控制器的用户界面。对于每个房间,我都有一个RoomViewController(NSViewController子类)的实例,它管理着一个相应的视图,该视图显示了用户可以更改的当前温度和目标温度。如何防止递归KVO通知?

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

如何避免KVO中的反馈回路?

回答

0

测试(你说,这是一所大学的类!):

一)是否在志愿更改通知设置属性为当前值的结果?

b)如果你没有改变你的财产,如果新的价值将是一样的,这将打破你的周期从MCU接收事件?

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

评论响应

我假设你已经测试(一)&(B),发现他们不这样做,你需要什么。所以也许你所追求的是一个拥有两名制定者的单一财产?一个setter触发KVO另一个不...

现在你谈论的温度,所以你的财产大概是一些数字类型。它是一个包装号码,如NSNumber或原始号码,如double

让我们假设后者作为前者是(很多)更多的参与!

所以:

  1. 你有一个数字,说double,属性由相同类型的实例变量的支持。
  2. 你已经@syntheize属性有编译器创建一个setter和一个getter,它可以改变/检索那个实例变量中的值。
  3. 您正在使用KVO来使用setter。
  4. 而且您希望能够在不触发KVO的情况下设置属性。
  5. 而对于原始的数字财产的所有二传手需要做的是设置实例变量...

问题解决了。好?

+0

由于来自MCU的事件,我不希望完全生成属性更改事件。如果MCU告诉我值已经改变,我不希望发送属性更改事件,因为这会导致应用程序更改刚刚报告的MCU中的值,这是不必要的。只有当用户手动编辑值时,才会发生更改事件。但是也许KVO不能以这种方式使用。 – 2012-03-15 09:48:14