NSCoding VS Основные данные - PullRequest
20 голосов
/ 05 марта 2012

Я искал статью, которая объясняет преимущества и недостатки NSCoding (NSKeyedArchiver ...) по сравнению с использованием CoreData (SQLite ....).

Вариантов много, я могу реализовать свой собственный двоичный читатель / писатель, использовать plists / xml / json ... или использовать SQLite или NSCoding.потерял прямо сейчас.Может ли кто-нибудь объяснить, в чем разница между ОСНОВНЫМИ функциями?

Ответы [ 4 ]

31 голосов
/ 05 марта 2012

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

Обычно NSCoding - это сериализатор данных.Многие встроенные объекты реализуют протокол NSCoder, который позволяет вам сохранять их как двоичный поток (файл, в BLOB-объекте sqlite и т. Д.). NSKeyedArchiver дает вам плюс поиска в таких потоках на основе строковой меткинемного похоже на словарь, но вы можете использовать только строки в качестве ключей.Этот подход хорош, если вам иногда приходится сохранять некоторые объекты разных классов.

Однако, если у вас есть много объектов одного и того же класса , вам лучше пойтидля подхода к базе данных, SQLite или CoreData.CoreData - это практически оболочка для SQLite, которая значительно облегчает разработку модели данных и выполняет запросы к БД за кулисами без необходимости написания операторов SQL.В CoreData вы определяете свои классы, и каждый экземпляр класса может сохраняться, т.е. вы можете возвращать значения членов объекта, не сохраняя их всегда в памяти.Это очень удобный способ хранения большого количества структурированных данных.Например, если вы напишете веб-браузер, вы можете сохранить закладки пользователя с именем, URL-адресом и, возможно, последним посещенным временем.

Для XML и JSON нет особого преимущества, если вы используетеданные только локально на устройство.Если вам необходимо связаться с какой-либо внешней службой, вы можете кэшировать / сохранять объекты XML / JSON, как они предназначены для дальнейшего использования.Другой подход заключается в том, чтобы восстанавливать эти данные из ваших внутренних структур данных (см. Выше) каждый раз, когда вам это нужно.

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

РЕДАКТИРОВАТЬ: я добавляю здесь ссылку на краткую ссылку для учебников о том, как использовать NSCoding , Базовые данные и, в качестве бонуса, SQLite .

ОБНОВЛЕНИЕ 12.01.2016: Если вы ищете постоянные решения, я предлагаю вам также проверить Realm .

9 голосов
/ 18 января 2014

Мэтт Томпсон обеспечивает удобочитаемую разбивку различных различий между NSCoding, Базовыми данными и NSKeyedArchiver на NSHipster: http://nshipster.com/nscoding/

3 голосов
/ 15 августа 2013

Всегда существует сопротивление между объектами и реляционными структурами.Я всегда предпочитаю объекты, так как доступ к данным обычно является частью функциональности вашего приложения.С NSCoding вы получаете простоту, простоту отладки и контроль с очень небольшим количеством кода для написания в любом случае.Вы также можете гибко включать NSCoding в свои структуры базы данных.

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

2 голосов
/ 21 марта 2017

Чтобы добавить и без того отличные ответы, NSCoding вместе с NSKeyedArchiver - это отличный способ хранить данные, которые слишком велики (или несовместимы по типу данных) для NSUserDefaults, но слишком малы и немногочисленны для CoreData.

...