Подтвердить что ты не робот

Каковы ограничения NSUserDefaults?

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

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

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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


NSUserDefaults vs Sqlite3

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

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


NSUserDefaults или Sqlite

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


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

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

Ответ 3

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

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

Ответ 4

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

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

то есть:.

myGlobalSettingsObject.lastLoginTime = @(now);

против.

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

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

например:.

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

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

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

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

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