Почему NSUserDefaults используется в iOS? - PullRequest
24 голосов
/ 10 января 2012

Я новичок в разработке для iOS и разработке мобильных приложений в целом, у меня достаточно знаний о шаблонах Objective C и MVC, которые я буду использовать, и я никогда не занимался разработкой для Mac.

Я изо всех сил пытаюсь понять, для чего NSUserDefaults?

У нас уже есть что-то вроде PList, в котором данные хранятся в виде XML, и у нас есть SQLite, который является облегченной БД для таких устройств.

Тогда зачем нам это?

Является ли это альтернативным простым хранилищем значений ключей для нашего приложения, точно так же, как у нас в облаке есть разные типы хранилищ, такие как СУБД, хранилище NoSQL на основе значений ключей и т. Д.?

Для NSUserDefaults Apple, документы говорят, что: -

«Приложения записывают такие предпочтения, присваивая значения набору параметров в базе данных пользователя по умолчанию»

Что они подразумевают под базой данных пользователя по умолчанию?

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

Так, как и в Mac OS X, в iOS также есть несколько пользователей, и в зависимости от того, кто вошел в систему, NSUserDefaults выбирает свои предпочтения?

Пожалуйста, скажите мне, если я ошибаюсь.

Ответы [ 5 ]

15 голосов
/ 23 февраля 2012

Одна вещь, которая еще не была упомянута: NSUserDefaults поддерживает все основные скалярные (float, int, BOOL) типы, а также plist-совместимые типы: NSData, NSString, NSNumber, NSDate, NSArray и NSDictionary.(Вы упомянули списки в качестве альтернативы - NSUserDefaults - это просто интерфейс для стандартного файла plist в папке Preferences приложения.) Это позволяет легко создать постоянное хранилище для состояния вашего приложения всего за несколько строк кода.Более того, если вы реализуете NSCoding для объектов вашей модели, вы можете заархивировать их в NSData и поместить их в NSUserDefaults:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:arrayOfModelObjects];

[[NSUserDefaults standardUserDefaults] setObject:data forKey:kDefaultsKeyModelObjects];

, а восстановление данных вашего приложения так же просто, как

- (void)viewDidLoad
{
    NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:kDefaultsKeyModelObjects];

    arrayOfModelObjects = [[NSKeyedUnarchiver unarchiveRootObject:data] retain];

    // error checking, tell UI to load the new values, etc...
}

(kDefaultsKeyModelObjects - это строковая константа, которую вы где-то определили. Всегда храните ключи NSUserDefaults в одном месте! Для отладки опечатки в имени ключа может потребоваться несколько часов.:)

Если вы использовали, например,SQLite для хранения данных вашего приложения, вы должны написать много кода для перемещения данных модели в базу данных и из нее.Это имеет смысл, если вы имеете дело с большим количеством данных, нуждаетесь в эффективном поиске и т. Д .;но если это, скажем, список серверов в сетевом приложении, проще и чище бросить их в NSUserDefaults.

И последнее: NSUserDefaults отлично подходит для создания прототипов.Даже если вы знаете, что в конечном итоге вам понадобится хранилище SQLite, вы можете начать использовать NSUserDefaults как быстрое и простое постоянное хранилище, чтобы ваш пользовательский интерфейс работал и ваша модель данных была детализирована, прежде чем писать кучу кода базы данных.

Так что, как и в Mac OS X, в iOS также есть несколько пользователей, и в зависимости от того, кто вошел в систему, NSUserDefaults выбирает его / ее предпочтения?

Нет, в iOS по умолчаниюplist находится в папке Library / Preferences приложения, а не в пользовательской папке, как в OS X. Я не могу себе представить, что iOS когда-либо будет иметь несколько входов в систему, но вы никогда не узнаете.Если это произойдет, им придется составлять отдельные списки по умолчанию для разных пользователей.

14 голосов
/ 10 января 2012

NSUserDefaults используется для сохранения небольших порций данных, от которых зависит правильное выполнение приложения, в то время как другие подходы хороши для хранения больших объемов данных, с которыми работает приложение.

NSUserDefaults делает невероятно простым, так как вам не нужно беспокоиться о файлах, объектах, выборках,…. Все это делается в одну строку.

5 голосов
/ 10 января 2012

Изначально он предназначен для хранения настроек, но, похоже, действительно используется (ab) для многих других вещей, если вопросы по SO есть что-то, что можно пройти. «Смысл» в том, что он обеспечивает однострочный метод сохранения и извлечения данных для широкого диапазона типов данных.

Нет многопользовательской конфигурации (пока?) на iOS (вам когда-нибудь приходилось входить в ваш iPhone?), Которая встроена в NSUserDefaults, но потому что OS X и iOS созданы на одной основе один и тот же класс используется для обеих операционных систем.

3 голосов
/ 10 января 2012

iOS - однопользовательская ОС. Следовательно, NSUserDefaults по-разному используется в OSX и iOS.

В iOS вы обычно используете NSUserDefaults для сохранения настроек приложения и / или пользовательских данных в «Системе по умолчанию iOS». Данные, сохраненные в системе настроек по умолчанию, будут постоянными даже при перезагрузке устройства iOS. На самом деле, даже когда пользователь обновляет приложение.

Обычно вы хотите использовать NSUserDefaults для сохранения настроек / настроек приложения. Любые другие массивные данные, такие как игровые данные или вычисления в реальном времени, должны быть сохранены в CoreData или sqllite в каталоге документов.

1 голос
/ 10 января 2012

NSUserDefaults сохраненные значения только для вашего приложения.

Примечание. Он не предназначен для замены традиционного хранилища данных (базовые данные, SQLite, списки свойств и т. Д. Предназначены для хранения данных приложения).NSUserDefaults предназначен для конкретных пар «ключ-значение».

Например, я использую его для хранения идентификатора сети и полного имени аутентифицированного пользователя после завершения процесса входа в систему.По истечении времени ожидания сеанса или выхода из системы я очищаю эти значения.Для этого NSUserDefaults светит.

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