Нужно ли использовать делегата для поддержки шаблона MVC при доступе к NSUserDefaults?
Все еще в назначении 4 из cs193p. - http://www.stanford.edu/class/cs193p/cgi-bin/drupal/system/files/assignments/Assignment%204_2.pdf
Я полностью (ish) реализовал отображение фотографий из списка мест.
Я добавляю вторую вкладку приложения (необходимые задачи 10 и 11), которая должна генерировать и отображать список из 20 самых последних фотографий, просматриваемых в хронологическом порядке.
Мой вопрос касается шаблона MVC и настройки / доступа к NSUserdefaults.
По сути, каждый раз, когда фотография просматривается, список свойств, хранящийся в NSUserdefaults, должен быть обновлен.
При выборе вкладки "последние фотографии" эти значения необходимо прочитать и отобразить, чтобы пользователь мог выбрать недавно просмотренную фотографию, а затем просмотреть ее, выбрав ее.
Я думаю, что я могу реализовать это довольно легко из написания строк кода, и это, вероятно, будет работать с точки зрения.
Я видел этот вопрос: Справка CS193P UITabBarController MVC по заданию 4, которая в некотором роде связана, но на самом деле не решает мой более теоретический вопрос о природе шаблона.
Мой вопрос больше о паттерне MVC.
В лекции, когда он продемонстрировал это с помощью избранных графиков, из предыдущего назначения калькулятора он использовал делегата для связи между контроллером представления списка избранных и графическим контроллером (см. Диаграмму на слайде 64 лекции 9). http://www.stanford.edu/class/cs193p/cgi-bin/drupal/system/files/lectures/Lecture%209_1.pdf
Я пытаюсь понять, нужно ли мне сделать что-то подобное, чтобы избежать нарушения шаблона MVC, или если я могу просто использовать NSUserdefaults в обоих viewWillLoad моего imageViewController, чтобы добавить фотографию в избранное и затем в моем сеттере в RecentImagesViewController, Я знаю, что NSUserdefaults рассчитан на постоянство, просто мне кажется, что я использую глобальную переменную.
Я понимаю, что этот вопрос сформулирован таким образом, что трудно следовать, если вы не знакомы с курсом cs193p - извините.
Спасибо за любой совет!
3 ответа
Ну, возможно, вы чувствуете, что вы используете глобальную переменную, потому что пользовательские значения по умолчанию являются глобальной концепцией. И они должны быть. Вы не хотите, чтобы разные части приложения работали с несинхронизированными версиями пользовательских настроек.
Но если вы используете термин переменная в смысле старого глобального C/C++ статического фрагмента данных, то нет... это не то, что есть. NSUserDefaults
был написан Apple, чтобы быть хорошим аккуратным классом, который инкапсулирует данные пользователя по умолчанию. Тот факт, что вы используете [NSUserDefaults standardUserDefaults]
доступ к чему-то похожему на одноэлементный экземпляр (не уверен, что именно так Apple решила его реализовать) все еще не означает, что это настоящая глобальная переменная.
Я согласен с Джеки Бой в том, что сохранять простоту лучше всего, но ваш вопрос на самом деле состоит в том, чтобы задавать вопрос о том, является ли поступок таким, какой вы есть, является нарушением шаблона MVC (и неуклюжее следование шаблону не всегда делает ваш код лучшим)., Это зависит от того, что вы считаете моделью. Я мог бы оправдать сказав, что Apple построил NSUserDefaults
быть инкапсуляцией на уровне модели данных предпочтений. Итак, у вас есть уровень модели, и ваши контроллеры должны быть в состоянии использовать его.
Или вы чувствуете необходимость написать весь слой модели самостоятельно, и в этом случае ваш слой модели будет иметь оболочку для NSUserDefaults
, Это казалось бы излишним для большинства ситуаций.
Вот, возможно, одна ситуация, которая может это оправдать. Если у вас есть много данных о предпочтениях, которые кажутся логически связанными, но некоторые из них не подходят для NSUserDefaults
, Возможно, это много двоичных данных, хранящихся в иерархии объектов, и вы хотите сохранить их с помощью Core Data. Но это все еще кажется логически связанным с тем, что вы держите в NSUserDefaults
, Может быть, тогда вы решите написать свой собственный слой модели, который инкапсулирует как базовые данные, так и NSUserDefaults
данные. Тогда ваши контроллеры могут использовать это напрямую.
Но, в целом, я думаю, что iOS хорошо спроектирована, чтобы иметь того, кому нужно просто использовать standardUserDefaults
объект напрямую.
Я не думаю, что вы должны преобразовать что-то довольно простое в нечто сложное. Вы храните избранное с помощью NSUserDefaults
и это все. Место, где вы используете, может быть не самым лучшим (я не говорю, что viewWillLoad
это плохое место, я не знаю ваш код), но я не думаю, что вам нужен делегат, чтобы просто обновить NSUserDefaults
, Боттон линия, не забывайте принцип KISS.:)
Если я правильно понимаю вопрос, это звучит так, как будто настройка / загрузка должны выполняться с соответствующего контроллера вида. Создание делегата (который может быть или не быть одноэлементным), который вы можете вызывать с каждого из контроллеров представления различных вкладок, поможет вам избежать дублирования кода.