Лучшая практика - доступ к предпочтениям по всему миру - PullRequest
3 голосов
/ 24 марта 2010

Пользовательские настройки для моего приложения хранятся в NSUserDefaults. Это включает в себя предпочтение «тема», которое часто используется несколькими классами. Я бы предпочел не вызывать "[[NSUserDefaults standardUserDefaults] objectForKey: ..." повторно, так как это делает для бессмысленного кода, и я предполагаю, что это приведет к накладным расходам. Каков предпочтительный и наиболее лаконичный метод доступа к предпочтениям в любом классе?

Ответы [ 3 ]

5 голосов
/ 24 марта 2010

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

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

3 голосов
/ 24 марта 2010

Накладные расходы настолько малы, что не имеют значения вообще. Остальное - это вопрос дизайна и баланса. «Правильный» способ решения этой проблемы с точки зрения проектирования - сделать зависимость от пользовательских настроек по умолчанию видимой, открыв выход в интерфейсе класса:

@interface ClassThatUsesSomethingFromDefaults : NSObject {
    NSUserDefaults *prefs;
}

@property(retain) NSUserDefaults *prefs;

Таким образом, ясно, что поведение этого класса меняется в зависимости от настроек пользователя по умолчанию, что хорошо. Это также упрощает работу со значениями по умолчанию в классе (вызов prefs вместо [NSUserDefaults standardUserDefaults]). И это облегчает изоляцию класса от остальной системы - вы можете использовать класс без значений по умолчанию, предоставить объект-заглушку по умолчанию или что-то в этом роде.

Недостатком этого решения является то, что вам нужно переосмыслить способ соединения объектов. Что действительно является преимуществом. Такие зависимости, как prefs, должны быть предоставлены вашему объекту «из внешнего мира», как, например, из Interface Builder или какого-то фабричного класса. (Как я уже говорил в начале, это вопрос баланса. Если у вас есть только одна строка предпочтений, вероятно, не стоит создавать все это, чтобы получить единственную строку.)

Синглтоны - это способ дьявола решить эту проблему - прочитайте Синглтоны - это патологические лжецы сообщение в блоге Мишко Хевери и сообщения в блогах, ссылки на которые есть оттуда.

0 голосов
/ 27 марта 2010

UPDATE: Вызов [NSUserDefaults standardUserDefaults] не вносит дополнительных затрат, хотя это может быть не самым кратким. Единственный раз, когда он может быть не самым кратким, это когда сложный объект содержится в предпочтении, например словарь или массив - в этом случае вы можете назначить локальную переменную при инициализации.

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