Каков рекомендуемый способ связи модели с контроллером представления? - PullRequest
6 голосов
/ 30 мая 2011

Например, у меня есть класс модели, который обрабатывает получение сообщений Bluetooth с других iPhone.Когда я получаю одно из этих сообщений, мне нужно обновить представление.Я считаю, что стандартный способ сделать это через контроллер представления.Контроллер представления имеет ссылку на модель и представление, и поэтому может связываться с каждым из них.

Однако как они должны отправлять сообщения обратно в ВК?Они могут иметь ссылку на контроллер представления каждый (как свойство, с назначением не сохранять).Это плохая практика (если я не ошибаюсь, это круговая ссылка)?
Есть ли альтернативные способы сделать это?Я рассмотрел шаблон делегата, но написать целый делегат, и все кажется довольно большой работой для простой проблемы.В качестве альтернативы, если вы думаете, что я обдумываю это, не стесняйтесь сказать мне!

[Я думаю, что этот вопрос, возможно, возник раньше, он кажется довольно распространенным, но я искал немного и не нашелмного]

Спасибо за помощь,

Ответы [ 2 ]

7 голосов
/ 30 мая 2011

В целом у вас есть 3 различных метода:

  1. Делегирование
  2. KVO (Наблюдение ключевого значения)
  3. Уведомления

Если вашей модели нужно только сообщить одному объекту (вашему контроллеру представления) об изменениях, делегирование - это путь. Может потребоваться дополнительная работа по созданию нового интерфейса, добавлению свойства делегата в модель и т. Д., Но это определенно стоит с точки зрения гибкости, повторного использования кода, дизайна и т. Д. Делегирование является стандартным шаблоном в программировании Какао и является широко используется в API Apple.

Если вашей модели необходимо сообщить нескольким объектам об изменениях, вы хотите использовать KVO или уведомления. С KVO вы можете подписаться на изменение событий для определенного свойства или ключа модели. Например, когда свойство 'messages' в вашей модели изменяется, любые подключенные слушатели могут быть уведомлены об изменении и ответить соответствующим образом.

Уведомления используются, когда вы хотите отправить сообщения всего приложения нескольким слушателям. Примерами стандартных API-интерфейсов являются уведомления клавиатуры (когда клавиатура отображается / отклоняется) и изменяется ориентация интерфейса.

Так что в вашем случае делегирование или KVO, вероятно, будет лучшим выбором.

0 голосов
/ 30 мая 2011

Никогда не делал этого в iOS-приложении, но в общих чертах mvc иногда имеет смысл (и сохраняет код чище), чтобы обновить представление непосредственно из модели, да.Это хорошо, на мой взгляд, но это связывает модель с представлением, что плохо.Таким образом, чтобы решить эту проблему, вы должны реализовать шаблон проектирования наблюдателя (широковещательный прием) (или использовать встроенную систему вещания / приема событий ios -> NSNotificationCenter).Таким образом, когда происходит что-то, что меняет модель, модель будет транслировать четность, независимо от того, слушает ли кто-то это событие или нет, это больше не является его проблемой, и поэтому вы отделяете представление от модели.

...