2013-08-17 4 views
0

У меня есть объект базы данных и некоторые объекты фотографий.Могу ли я частично сэкономить на NSKeyedArchiver?

Объект базы данных содержит целочисленное свойство и свойство изменяемого словаря.

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

Фотообъекты содержат изображение, описание изображения и дату, когда изображение было снято.

Я использую NSKeyedUnarchiver и NSKeyedArchiver для чтения и записи этих объектов, когда запускаются методы applicationDidBecomeActive и applicationWillResignActive.

И все это хорошо работает. Когда applicationWillResignActive запускает, он вызывает NSKeyedArchiver и указывает его на объект базы данных в качестве корня. Затем кодер выписывает целое число, а затем, когда он встречает изменяемый словарь, он спускается в него, и каждый объект фотографии вызывается для сохранения его свойств, которые являются образом, описанием и датой.

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

Я обнаружил, что чтение архива примерно в 25 раз быстрее, чем его запись.

Итак, я задумал только написать новые фотографии или изменить их как способ ускорения записи. В конце концов, большинство фотографий из прошлых сессий, и у меня может быть 30 или 50 из них, и на этот раз я мог бы снимать только два или три новых.

Я создал несколько флагов, которые указывают, является ли фотография новой или старой. Когда applicationWillResignActive запускается, и я нахожусь в объекте обработки фотографий, обрабатывающих каждый вызов encodeWithCoder, я сохраняю изображение, описание и дату, если фотография новая, и я пропускаю сохранение, если оно устарело.

Ну, я не получил результат я надеялся :-)

Когда applicationWillResignActive триггеров, все фотографии, которые я скип выписывая в конечном итоге получить выписаны, как пустые объекты фотографии, которые переписывают предыдущие объекты фото с тем же ключом. Затем, когда я загружаю их, у меня есть bupkis, nada, zip.

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

Gallymon

ответ

0

Использование архивов некоторого массива объектов будет становиться все более неэффективным по мере роста архива. Это усугубляется тем фактом, что ваши объекты включают изображения. Две мысли:

  1. Вы должны рассмотреть возможность использования Core Data для хранения этих данных. (Вы также можете использовать SQLite, но Core Data - предпочтительная технология сохранения объектов в iOS.) Таким образом, когда вы хотите сохранить новый объект, вы просто добавляете этот новый объект и не архивируете всю коллекцию объектов каждый раз.

  2. Кроме того, если скорость представляет большой интерес, и если ваши изображения большие, SQLite (база данных, которую использует Core Data по умолчанию) неэффективна при обработке больших BLOB-объектов (например, изображений). Таким образом, как это ни странно, вы, вероятно, захотите сохранить изображения в своей папке Documents и сохранить только URL-адрес или путь к файлу изображения в CoreData.

+0

Rob, если я вытаскиваю изображения из объектов, которые я сохраняю и восстанавливаю с помощью NSKeyedArchiver для сохранения в папке с документами, то я подозреваю, что оставшиеся вещи будут очень быстрыми. Итак, каково было бы преимущество использования Core Data, а не позиционирования для будущего с большими данными? – Gallymon

+0

В документе «Руководство по программированию и сериализации программ» я увидел следующее: «Не читайте ключи, которые вам не нужны. Вы не обязаны читать всю информацию из архива для определенного объекта, ... , и это намного дешевле, чем. Однако непрочитанные данные по-прежнему вносят вклад в размер архива .... » Означает ли это, что если у меня есть объекты, которые я пишу, и я пропущу некоторые из них, что предыдущие версии этих объектов, написанные ранее, все равно должны быть там, когда я захочу прочитать все мои объекты позже. Или это заблуждение с моей стороны? – Gallymon

+0

@Gallymon В ответ на ваш первый вопрос, если вы вытащили изображения из объектов, тогда архиватор должен быть достаточно быстрым, но он по-прежнему не очень эффективен (зачем писать все объекты в коллекции, когда у вас есть только один новый). Логическим инструментом является Core Data, но, конечно же, вы можете делать все, что хотите. – Rob

0

почему вы не сохраните изображение только на методе инициализации? если вы создадите объект, вы хотите его сохранить. поэтому поставьте флаг hasChanges == off в методе init и вы проверите этот флаг для сохранения ...

Смежные вопросы