Какой способ хранения данных (изображения)?NSData, String или Transformable - PullRequest
4 голосов
/ 26 ноября 2011

Я работал с кодировкой base64. Я успешно закодировал изображения в NSString из NSData, я также декодировал их обратно в NSData.

Так что сейчас я хочу хранить изображения в Core Data. Но лучше ли хранить NSString, NSData или третий преобразуемый?

Причина, по которой я конвертирую изображения в NSString, заключается в том, что я тоже хочу сохранить их в XML.

Заранее спасибо.

Ответы [ 4 ]

8 голосов
/ 27 ноября 2011

Преобразование (согласно @timthetoolman) - самый простой способ.Если ваши изображения большие, однако, начиная с iOS 5, правильный способ сделать это - использовать тип атрибута «Двоичные данные» и выбрать «Разрешить внешнее хранение», чтобы базовые данные могли хранить большой блок данных внебаза данных.Это может быть намного эффективнее.

7 голосов
/ 26 ноября 2011

Используйте NSValueTransformer для преобразования вашего изображения в объект NSData, а затем сохраните большой двоичный объект данных в Core Data. Вы можете зарегистрировать свой подкласс преобразователя значения в инструменте моделирования. Вы можете проверить пример Apple PhotoLocations или этот учебник показывает, как.

Исправьте для полноты: поскольку другие указали, что слишком большой большой двоичный объект данных вызовет проблемы с производительностью. Как отмечает @Jesse, в iOS5 есть оптимизация, при которой, если большой двоичный объект данных слишком велик, Core Data будет хранить его вне постоянного хранилища. Если вам нужно настроить таргетинг на версию до iOS5, а изображение слишком велико, сохраните файл где-нибудь в песочнице и сохраните URL-адрес в хранилище базовых данных. Хорошее обсуждение на форумах Apple Dev здесь и обсуждает пределы хранения больших двоичных объектов данных в Core Data.

Удачи

1 голос
/ 20 сентября 2013

Целевая iOS5 или более поздняя версия - хранение изображений Performant становится тривиальным

Более новые версии Xcode и iOS теперь делают хранение изображений простым и эффективным.Вам больше не нужно хранить изображения в основных данных для удобства или в файловой системе для повышения производительности - Core Data позаботится об этом за вас.

  • UIImage теперь соответствует NSCoding в iOS 5. Если вы можете настроить таргетинг на iOS 5 и более поздние версии, вы можете просто установить атрибут управляемого объекта как Transformable и все готово.
  • Если вы отметите опцию «Разрешить внешнее хранилище», Core Data примет решение, сохранять ли BLOB-объект в управляемом объекте или в виде внешнего файла - все прозрачно для разработчика.чтобы большие изображения сохранялись за пределами вашего основного хранилища данных
1 голос
/ 26 ноября 2011

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

// JPEG
[UIImageJPEGRepresentation(image, 1.0) writeToFile:jpgPath atomically:YES];

// PNG
[UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES];
...