Cocoa 如何防止递归KVO通知?

Cocoa 如何防止递归KVO通知?,cocoa,events,notifications,key-value-observing,Cocoa,Events,Notifications,Key Value Observing,我正在为大学的微控制器课程做UI。这是一个温度控制器的用户界面,可以控制不同房间的温度。对于每个房间,我都有一个RoomViewController实例(一个NSViewController子类),它管理相应的视图,该视图显示当前温度和可由用户更改的目标温度 我的意图是使用Cocoa绑定将目标临时显示的值绑定到RoomViewController中的属性,然后让另一个类侦听这些属性,以通过串行方式将这些更新发送到微控制器。问题是,更改也可能来自微控制器,这意味着由于来自微控制器的事件,我必须以编

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

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

如何在KVO中防止这种反馈循环?

测试(您说过这是一门大学课程!):

a) 将属性设置为其当前值是否会导致KVO更改通知

b) 从MCU接收事件时,如果您不更改属性,则新值将相同,这是否会中断您的周期

c) 想想你能做的另一个测试

评论回复

我假设您已经测试了(a)和(b),发现它们不能完全满足您的要求。所以也许你想要的是一个有两个setter的单一属性?一个setter触发KVO,另一个不

现在你们讨论的是温度,所以你们的属性大概是一些数字类型。它是一个包装数字,如
NSNumber
,还是一个原语数字,如
double

让我们假设后者,因为前者(很多)更复杂

因此:

  • 您有一个数值属性,比如说
    double
    ,由同一类型的实例变量支持
  • 您已经使用
    @syntheize
    属性让编译器创建一个setter和一个getter来更改/检索该实例变量中的值
  • 您正在使用KVO来获取setter的用法
  • 您希望能够在不触发KVO的情况下设置属性
  • 对于一个基本的数值属性,setter需要做的就是设置实例变量

  • 问题解决了。确定吗?

    我根本不希望由于来自MCU的事件而生成属性更改事件。如果MCU告诉我值已更改,我不希望发送属性更改事件,因为这将导致应用程序更改刚刚报告的MCU中的值,这是不必要的。只有当用户手动编辑值时,才会发生更改事件。但也许KVO不能以这种方式使用。