2012-03-15 2 views
1

Я делаю пользовательский интерфейс для университетского класса в микроконтроллерах. Это пользовательский интерфейс для контроллера температуры, который контролирует температуру в разных комнатах. Для каждой комнаты у меня есть экземпляр RoomViewController (подкласс NSViewController), который управляет соответствующим представлением, которое отображает текущую временную и целевую температуру, которые могут быть изменены пользователем.Как предотвратить рекурсивные уведомления KVO?

Мое намерение состояло в том, чтобы привязать значение целевого дисплея темпа к свойству в RoomViewController, используя привязки Cocoa, а затем другой класс прослушивает эти свойства для отправки этих обновлений на микроконтроллер через последовательный порт. Проблема в том, что изменения также могут исходить от микроконтроллера, что означает, что я должен установить свойство программно из-за событий с микроконтроллера. Это приведет к уведомлению об изменении свойств, которое приведет к изменению значения в MCU, что приведет к событию из MCU, которое приведет к изменению свойств и так далее. Он превратился бы в бесконечный цикл.

Как предотвратить такую ​​петлю обратной связи в KVO?

ответ

0

Test (вы сказали, что это класс университета!):

а) Есть ли значение свойства к его текущему результату значение в уведомлении изменения КВО?

b) При получении события от MCU, если вы не измените свою собственность, если новое значение будет таким же, это нарушит ваш цикл?

c) Подумайте о другом испытании, которое вы можете сделать!

Комментарий Ответ

Я предполагаю, что вы опробованный (а) & (б) и обнаружил, что они не делают именно то, что вам требуется. Так что, возможно, что вам нужно, это одно свойство с двумя сеттерами? Один сеттер запускает KVO, другой нет ...

Теперь вы говорите о температуре, поэтому ваше свойство, предположительно, является числовым. Это обернутое число, как в NSNumber, или примитивное число, как в double?

Предположим, что последний, поскольку первый (более) задействован!

Итак:

  1. У вас есть числовой, скажем double, свойство подкрепленную переменной экземпляра одного и того же типа.
  2. У вас есть @syntheize свойство имеет компилятор, создающий сеттер и getter, которые изменяют/извлекают значение в этой переменной экземпляра.
  3. Вы используете KVO, чтобы забрать использование сеттера.
  4. И вы хотите иметь возможность установить свойство без запуска KVO.
  5. И для примитивных числовых собственностей все сеттер нужно сделать, это установить переменный экземпляр ...

Проблема решена. ОК?

+0

Я не хочу, чтобы событие изменения свойства генерировалось вообще из-за события из MCU.Если MCU сообщает мне, что значение изменилось, я не хочу, чтобы событие изменения свойства отправлялось, поскольку это приведет к тому, что приложение изменит значение в MCU, о котором было только что сообщено, что-то не нужно. Только когда пользователь вручную редактирует значение, если произойдет событие изменения. Но, возможно, KVO нельзя использовать таким образом. –