Как предотвратить рекурсивные уведомления KVO? - PullRequest
1 голос
/ 15 марта 2012

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

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

Как можно предотвратить такие петли обратной связи в КВО?

1 Ответ

0 голосов
/ 15 марта 2012

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

a) Приводит ли установка свойства к его текущему значению в уведомлении об изменении KVO?

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

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

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

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

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

Давайте предположим, что последнее, как первое, (намного) более вовлечено!

Итак:

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

Проблема решена.OK

...