Понимание шаблона проектирования MVC в Cocoa Touch - PullRequest
5 голосов
/ 20 марта 2012

Обычно я просто произвольно собираю приложение, если оно работает, но это означает, что я не обращаю никакого внимания на шаблоны проектирования. Мое приложение в настоящее время широко использует глобальные переменные (я несу экземпляр моего AppDelegate в каждом контроллере представления для доступа к свойствам, которые я объявил в моем AppDelegate.h). Хотя это и делает то, что я хочу, я читал, что это не очень хорошая практика проектирования.

Итак, я хочу начать делать свой код "легальным". Однако я не могу представить свое приложение сейчас без глобальных переменных. Они так важны для благополучия приложения, но это должно означать, что я делаю что-то не так, верно? Я просто не могу представить, как еще я бы сделал некоторые вещи. Возьмите для примера это:

enter image description here

Здесь у вас есть два контроллера вида: SideViewController и MainViewController. Используя глобальные переменные, такие как, скажем, если у всего приложения был один общий экземпляр SideViewController и MainViewController (appDelegate.sideViewController и appDelegate.mainViewController), я могу легко обмениваться данными между двумя контроллерами представления, так что если я нажму "Новости" Feed "в моем SideViewController, я могу сказать своему MainViewController перезагрузить его представление.

Однако я не могу себе представить, как это было бы сделать, если бы это не были глобальные переменные? Если в моем SideViewController произойдет какое-либо событие, как я сообщу об этом в MainViewController способом, соответствующим стандартам дизайна?

1 Ответ

5 голосов
/ 20 марта 2012

Я не могу себе представить, однако, как это было бы сделать, если бы это не были глобальные переменные?Если в моем SideViewController происходит событие, как бы я уведомил свой MainViewController способом, соответствующим стандартам проектирования?

Точно так же, как вы делаете это сейчас, за исключением того, что SideViewController получает ссылкув MainViewController из другого места.

Как создаются эти два контроллера представления?Вероятно, это происходит одним из двух способов:

  1. Один из объектов создает другой.В этом случае, возможно, MainViewController создает SideViewController.

  2. Некоторые другие объекты, такие как делегат приложения или другой контроллер представления, создают их оба.

В первом случае MainViewController имеет ссылку на SideViewController, как только он его создает.Он может хранить эту ссылку в одной из своих собственных переменных экземпляра, так что он всегда может отправлять сообщения в созданный им SideViewController.Точно так же MainViewController может дать SideViewController ссылку на себя (то есть на MainViewController), а SideViewController может сохранить его и использовать в будущем для связи со своим MainViewController.

Второй случай аналогичен- если делегат приложения (или некоторый другой объект) создает и MainViewController, и SideViewController, этот объект знает об обоих объектах и ​​может настроить каждый из них со ссылкой на другой.

В обоих случаях рассматриваемые объектывозможность общаться друг с другом так же легко, как они когда-либо, и нет необходимости в глобальной переменной.

То, что я объяснил выше, возможно, самый простой способ выполнить то, что вы просили - общение между двумяобъекты.Существует ряд шаблонов, которые можно использовать для уточнения отношений между этими объектами, чтобы сделать ваш код еще лучше:

  • делегирование: Предоставить SideViewController свойство делегата,и определить некоторый протокол, который устанавливает, что SideViewController ожидает от своего делегата.Реализуйте этот протокол в MainViewController.Сделайте ваш экземпляр MainViewController делегатом SideViewController.SideViewController не нужно точно знать, какой тип его делегата - его заботит только то, что его делегат реализует требуемый протокол.Это позволяет легко использовать SideViewController с чем-то отличным от MainViewController, если такая возможность возникает, или использовать его в другом проекте.

  • уведомления: SideViewController может даже не работатьнужен делегат - он может просто передавать уведомления об определенных событиях любому объекту, который прослушивает.Это особенно эффективно, если более чем одному объекту необходимо знать о том, что происходит в SideViewController, или если объекты, которые заботятся о действиях SideViewController, могут измениться.

  • MVC: Вместо того, чтобы сообщать MainViewController, что что-то изменилось, SideViewController просто изменяет данные в модели.Всякий раз, когда появляется представление MainViewController (или представление любого другого контроллера представления, в этом отношении), контроллер считывает данные из модели и отображает само себя.

Если вам интересно, вы можетехочу взять копию шаблонов дизайна какао Эрика Бака , в которых подробно и подробно объясняются эти и многие другие.Не думайте, что вы должны выучить все это сразу, или что это слишком много проблем.Узнайте немного за раз и посмотрите, как это улучшает (или не улучшает) ваши проекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...