У меня есть объект базы данных и некоторые объекты фотографий.Могу ли я частично сэкономить на NSKeyedArchiver?
Объект базы данных содержит целочисленное свойство и свойство изменяемого словаря.
Целое число отслеживает следующий свободный номер для использования в качестве изменяемого словарного ключа при создании нового фото объекта, а изменяемый словарь содержит указатели на фотообъекты.
Фотообъекты содержат изображение, описание изображения и дату, когда изображение было снято.
Я использую NSKeyedUnarchiver и NSKeyedArchiver для чтения и записи этих объектов, когда запускаются методы applicationDidBecomeActive и applicationWillResignActive.
И все это хорошо работает. Когда applicationWillResignActive запускает, он вызывает NSKeyedArchiver и указывает его на объект базы данных в качестве корня. Затем кодер выписывает целое число, а затем, когда он встречает изменяемый словарь, он спускается в него, и каждый объект фотографии вызывается для сохранения его свойств, которые являются образом, описанием и датой.
Как я уже сказал, все работает хорошо. Но, это показалось медленнее и медленнее, поскольку количество фотографий увеличилось, поэтому я сделал некоторые тайминги.
Я обнаружил, что чтение архива примерно в 25 раз быстрее, чем его запись.
Итак, я задумал только написать новые фотографии или изменить их как способ ускорения записи. В конце концов, большинство фотографий из прошлых сессий, и у меня может быть 30 или 50 из них, и на этот раз я мог бы снимать только два или три новых.
Я создал несколько флагов, которые указывают, является ли фотография новой или старой. Когда applicationWillResignActive запускается, и я нахожусь в объекте обработки фотографий, обрабатывающих каждый вызов encodeWithCoder, я сохраняю изображение, описание и дату, если фотография новая, и я пропускаю сохранение, если оно устарело.
Ну, я не получил результат я надеялся :-)
Когда applicationWillResignActive триггеров, все фотографии, которые я скип выписывая в конечном итоге получить выписаны, как пустые объекты фотографии, которые переписывают предыдущие объекты фото с тем же ключом. Затем, когда я загружаю их, у меня есть bupkis, nada, zip.
Первый вопрос, я думаю, это я могу написать только часть моего дерева объектов, а части, которые я не выписываю, все еще остаются там нетронутыми из более ранней полной записи? Я начинаю задаваться вопросом, может ли это быть наивной идеей.
Gallymon
Rob, если я вытаскиваю изображения из объектов, которые я сохраняю и восстанавливаю с помощью NSKeyedArchiver для сохранения в папке с документами, то я подозреваю, что оставшиеся вещи будут очень быстрыми. Итак, каково было бы преимущество использования Core Data, а не позиционирования для будущего с большими данными? – Gallymon
В документе «Руководство по программированию и сериализации программ» я увидел следующее: «Не читайте ключи, которые вам не нужны. Вы не обязаны читать всю информацию из архива для определенного объекта, ... , и это намного дешевле, чем. Однако непрочитанные данные по-прежнему вносят вклад в размер архива .... » Означает ли это, что если у меня есть объекты, которые я пишу, и я пропущу некоторые из них, что предыдущие версии этих объектов, написанные ранее, все равно должны быть там, когда я захочу прочитать все мои объекты позже. Или это заблуждение с моей стороны? – Gallymon
@Gallymon В ответ на ваш первый вопрос, если вы вытащили изображения из объектов, тогда архиватор должен быть достаточно быстрым, но он по-прежнему не очень эффективен (зачем писать все объекты в коллекции, когда у вас есть только один новый). Логическим инструментом является Core Data, но, конечно же, вы можете делать все, что хотите. – Rob