Добавление базовых данных в приложение iPhone с существующими (простыми) моделями - PullRequest
7 голосов
/ 10 августа 2011

У меня довольно сложное приложение для iPhone, которое использует API для извлечения данных с сервера и отображения их пользователю.У меня есть около 5 классов моделей, которые используются во всем приложении - они просто расширяют NSObject.

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

Является ли Core Data правильным решением для этого?Трудности, которые я вижу, следующие:

  • Мне бы пришлось изменить способ создания объектов моей модели на протяжении всего проекта.Мне бы пришлось инициализировать их как часть контекста, что не обязательно имеет смысл, если они на самом деле исходят из внешнего API.
  • Мне нужно быть осторожным, чтобы не сохранять экземпляры, которые мне не нужны,Похоже, это сводится либо к удалению управляемого объекта сразу после его создания (действительно неловко), либо к использованию отдельного непостоянного контекста для экземпляров, которые я не хочу сохранять (лучше, но все же несколько неловко)

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

Если я пытаюсь попробоватьвтиснуть основные данные в это, и если да, то как?Или я должен просто посмотреть на другие варианты - sqlite3 (кажется немного сложным для того, что мне нужно), пользовательские настройки по умолчанию (вероятно, не то, для чего они предназначены) или даже сериализацию и запись моих собственных объектов в файлы (кажется, хакерство)).

Спасибо за любой вклад!

Ответы [ 2 ]

3 голосов
/ 10 августа 2011

Почему бы не взглянуть на NSKeyedArciver / Unarchiver? Я бы сказал, что Core Data является очевидным решением при работе с очень большими объемами данных вместе с базами данных sqlite, но NSKeyedArchiver - это то, что я использую для сохранения моделей. Ознакомьтесь с документацией Apple здесь . Использование NSKeyedArchiver - это довольно простая IMO, и вы можете хранить с ней практически все, что вам нужно.

1 голос
/ 10 августа 2011

Прямо сейчас вы создаете объекты данных как подклассы NSObject. Вы можете использовать другой уровень косвенности, чтобы выбрать, создавать ли объект в качестве подкласса ManagedObjectModel, и оставить большую часть вашего приложения нетронутой, используя протокол, определяющий интерфейс, который вы используете для доступа к информации из этих объектов, а затем передавая объекты типа id<DataObjectProtocol>. Невозможность получить будет указанием на нелокальный объект.

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

Я бы выбрал Core Data из-за его гибкости, полезности и оптимизации. Это действительно стоит изучить. Я не рекомендовал бы подход sqlite3, путь вперед на iOS - Core Data. Если вы используете какой-либо тип файлового хранилища, вам следует подумать о том, как выполнять пакетное чтение и / или запись, поскольку вы можете столкнуться с некоторыми проблемами с производительностью при выполнении нескольких небольших файловых операций.

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