2015-03-26 3 views
0

Я создаю приложение с Objective-C, и я хотел бы сохранить данные. Я сомневаюсь между NSKeyedArchiver и core Data. Я знаю, что в Интернете много информации об этом (в том числе Objective-C best choice for saving data), но я все еще сомневаюсь в том, что я должен использовать. Вот две вещи, которые заставляют меня задаться вопросом:NSKeyedArchiver vs Core Data

(1) Я предполагаю, что у меня будет около 1000-10000 объектов для обработки данных объемом 1-10 Мб. Я буду выполнять стандартные запросы к базам данных по этим объектам. Я хотел бы иметь возможность загружать все эти объекты при запуске и время от времени сохранять их - время обработки 1 секунды для загрузки или сохранения будет прекрасным для меня.

(2) На данный момент моя модель довольно сложна: например, класс А содержит среди других свойств массив класса В, который сам формирует (среди прочих) свойство типа classC и свойство типа classD. А сам класс D содержит свойства типа classE.

Я имею право предположить, что (1) означает, что NSKeyedArchiver все равно будет работать нормально и что (2) означает, что использование core Data может быть не очень простым? Я попытался найти случаи, когда core Data использовалась со структурой сложного объекта, например, в моем случае (2) в Интернете, но не нашла много ресурсов. На данный момент я больше всего воздерживаюсь от его использования.

+0

Я бы предложил использовать данные ядра, чтобы облегчить использование диаграммы объектов. – andrewbuilder

ответ

2

две вещи, которые вы определить, как заставить меня наклониться к использованию CoreData, а не NSKeyedArchiver:

  1. CoreData вполне в состоянии справиться с 10000 объектов (если не значительно больше), и он может поддерживать относительно неразветвленной пересылать «данные в виде базы данных» запросов данных (сортировка с NSSortDescriptors, фильтрация с помощью NSPredicate). Есть ограничения на то, что может быть достигнуто, но в худшем случае вы можете загрузить все данные в память - вот что вам нужно сделать с решением NSKeyedArchiver.

    Загрузка в субсекундах должна быть достижимой (я только что испытал с 10 000 объектов в сумме 14 Мб, в 0,17 секунды в симуляторе), особенно если вы оптимизировали сначала загрузку только важных данных и позволили процессу сбоя CoreData при необходимости добавьте дополнительные данные. Опять же, это будет лучше, чем NSKeyedArchiver.

  2. Несмотря на то, что большинство демонстрационных примеров/обучающих программ выбирают относительно прямые модели данных (достаточно для демонстрации атрибутов и отношений), CoreData может справиться с гораздо более сложными моделями данных. Ниже приведен макет отношений, которые вы описываете, что потребовалось несколько минут, чтобы собрать:

Data Model

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

Надеюсь, что это поможет.

+0

Да, спасибо за очень полный ответ и большой макет, и это, безусловно, поможет мне. Я буду использовать основные данные. – vib