Каковы ограничения NSUserDefaults? - PullRequest
45 голосов
/ 30 мая 2011

Постоянное хранение данных на iPhone обычно выполняется с использованием Core Data или sqlite3. Большинство людей предпочитают использовать NSUserDefaults в качестве хранилища для настроек приложения, а не использовать его в качестве обычной базы данных (например, sqlite).

Я обнаружил, что в NSUserDefaults может храниться большой объем данных, он чрезвычайно прост в использовании и быстр. Так почему бы не использовать это в качестве постоянного хранилища? Каковы ограничения NSUserDefaults в качестве базы данных?

Обновление:
Я часто использую три разных способа сохранения своих данных на диск.

  • Основные данные
  • Сериализация объектов в списки
  • NSUserDefaults

Я больше не использую FMDB (или sqlite напрямую). Каковы основные преимущества и недостатки каждого подхода?

Некоторые преимущества NSUserDefaults, с которыми я столкнулся:

  • С помощью NSPredicate можно легко выполнить сортировку, группировку и т. Д.
  • NSUserDefaults является потокобезопасным.
  • Для извлечения и сохранения данных в NSUserDefaults требуется одна строка.

Ответы [ 4 ]

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

Sqlite3 более полезен для хранения большой базы данных и доступа к элементам базы данных.Вы можете сортировать элементы базы данных Sqlite3, вы можете очень быстро искать элементы в базе данных Sqlite3.База данных Sqlite3 имеет много привилегий, которых у NSUserDefaults не было!


NSUserDefaults vs Sqlite3

NSUserDefaults для пользовательских предпочтений, обычно базовых объектов, таких как NSString илиNSNumber.Sqlite, сериализация коллекции объектов в списке свойств или базовые данные - все это допустимые параметры для хранения пользовательских данных, таких как созданные вами объекты модели.

Вы не увидите разницу в скорости, но она все равноЛучше всего выбрать правильный механизм для того, что вы делаете.Если это просто настройки, используйте NSUserDefaults, в противном случае я бы сериализовал ваши объекты в plist.Если вы новичок в Какао, я бы сначала отказался от Core Data и даже Sqlite, чтобы дать себе возможность сначала изучить основы.


NSUserDefaults или Sqlite

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


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

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

  1. http://www.cocos2d -iphone.org / forum / topic / 9308
  2. http://www.cocos2d -iphone.org / forum / topic / 9210
9 голосов
/ 08 ноября 2011

NSUserDefaults предлагает тривиальную кривую обучения и поточно-ориентированную реализацию.

В остальном я обнаружил, что Core Data превосходят во всех отношениях. Особенно в отношении настройки значений по умолчанию и процедур миграции.

Редактировать: Как выясняется, NSUserDefaults "потокобезопасности", кажется, происходит от выполнения операций в основном потоке. Это вызвало серьезный пропуск кадров в одном из моих приложений; Я закончил тем, что разорвал NSUserDefaults и заменил его на поточно-ориентированный NSMutableDictionary, который сериализовался в файл.

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

Для проекта, над которым я сейчас работаю, мне нужно создать большую базу данных (около 400 000 записей).Если вы используете NSUserDefaults, вы должны добавить записи, которые могут занять до нескольких минут (в зависимости от устройства и способа импорта данных).Если вы используете CoreData, вы можете просто скопировать предварительно созданную базу данных в каталог документов вашего приложения и использовать ее немедленно.

Именно поэтому я полагаюсь на CoreData.

1 голос
/ 05 мая 2016

Одним из преимуществ CoreData является то, что ваш объект будет NSManagedObject со свойствами. Это означает, что когда вы получите или установите значения, у вас будет автозаполнение, чтобы помочь вам с именами свойств. Это также делает код более читабельным.

Между тем, с NSUserDefaults, вы всегда должны использовать средства доступа со значением ключа, используя строки для ключа.

т.е:.

myGlobalSettingsObject.lastLoginTime = @(now);

против

[[NSUserDefaults standardUserDefaults] setValue:@(now) forKey:@"lastLoginTime"];

Что если вы случайно сделаете опечатку при установке ключа где-нибудь? Компилятор не предупредит вас. Что если кто-то вставит не тот тип? Компилятор не предупредит вас.

например:.

[[NSUserDefaults standardUserDefaults] setValue:@"now" forKey:@"lastLoginTiem"]; ^ ^ ^^^^

... не вызовет ни предупреждения, ни ошибки во время сборки ... опасно!

Другие преимущества использования NSManagedObject заключаются в том, что он может иметь проверку; он может обеспечить ненулевые значения; у него могут быть собственные методы получения и установки, которые вы можете использовать для выполнения некоторых интересных вещей; он может обрабатывать автоматическую миграцию, если вы что-то измените в том, как хранятся все значения; и его модель данных становится частью вашего хранилища, так что вы можете легко отслеживать историю изменений в ней.

Между тем, NSUserDefaults быстрый и грязный, и отлично подходит для простых небольших приложений, но он просто очень прост. Хорошо для небольшого приложения, но если у вас огромное приложение, им будет трудно управлять по сравнению с использованием Core Data.

Единственная возможная вещь в NSUserDefaults заключается в том, что если вашему приложению необходимо удалить свое хранилище CoreData или вы не хотите суетиться с реализацией поточно-ориентированных CoreData, в этом отношении его обслуживание будет меньше.

...