2012-03-15 18 views
1

私はマイクロコントローラで大学のクラスのUIをやっています。これは、異なる部屋の温度を制御する温度コントローラのユーザーインターフェースです。各部屋について、私はルームビューコントロール(NSViewControllerサブクラス)のインスタンスを持っています。これは現在の温度とターゲット温度を表示する対応ビューを管理します。再帰的なKVO通知を防ぐ方法は?

私の意図は、Cocoaバインディングを使用してRoomViewControllerのプロパティにターゲットtempディスプレイの値をバインドし、これらのプロパティをリッスンしてこれらのアップデートをシリアル経由でマイクロコントローラに送信することでした。問題は、マイクロコントローラーからのイベントによってプログラムでプロパティを設定する必要があることを意味する変更もマイクロコントローラーから来る可能性があるということです。これはプロパティ変更の通知をもたらし、MCUの値を変更することになり、MCUからのイベントが発生し、プロパティの変更などが発生します。それは無限ループに変わります。

KVOでこのようなフィードバックループを防止するにはどうすればよいですか?

答えて

0

テスト(あなたはこれが大学のクラスと言った!):

a)はKVO変更通知に現在の値の結果にプロパティを設定していますか?

b)MCUからイベントを受け取ったときに、新しい値が同じになるとプロパティを変更しない場合、これはサイクルを壊しますか?

c)あなたができる別のテストを考えてみましょう!

コメント応答

私はあなたが(a)の&(B)をテストし、彼らはあなたが必要と正確に何をしていないことがわかりましたと仮定します。だから、あなたがしているのは、2人のセッターを持つ単一のプロパティです。 1つのセッターがKVOを引き起こします。

ここであなたのプロパティはおそらく数値型です。 NSNumberのようなラップされた番号か、doubleのようなプリミティブ番号ですか?

前者を前者としましょう(もっとたくさん)!だから、

  1. あなたは同じタイプのインスタンス変数に裏打ちされた数値、doubleを言う、プロパティを持っています。
  2. あなたは@syntheizeのプロパティを持っています。そのインスタンス変数の値を変更/取得するセッターとゲッタをコンパイラに作成させるようにします。
  3. KVOを使用してセッターの使用方法を選択しています。
  4. また、KVOをトリガーせずにプロパティを設定できるようにしたいとします。
  5. そして、すべてのセッターは、インスタンス変数を設定して行う必要があるプリミティブ数値プロパティの
  6. ...

問題は解決しました。 OK?

+0

私は、MCUからのイベントのためにプロパティ変更イベントがまったく生成されないようにしたいと考えています。MCUがその値が変更されたことを通知した場合、私はプロパティ変更イベントを送信したくないので、アプリケーションがただ報告されたMCUの値を変更することになります。変更イベントが発生した場合、ユーザーが手動で値を編集した場合のみ。しかし、おそらくKVOはこのように使うことはできません。 –

関連する問題