2010-12-28 3 views
3

Я разрабатываю приложение, которое позволяет пользователю записывать видео и фотографии. Теперь мне интересно, что лучше всего их хранить?Сохранение фотографий и видео в Core Data?

Первая идея состоит в том, чтобы сохранить ее в библиотеке фотографий пользователя, точно так же, как если бы он записал фотографию из приложения «Камера» и использовал ссылку на файлы. Теперь проблема в том, что пользователь может получать и удалять файлы из приложения «Фотографии», которое может понадобиться моему приложению. Я не думаю, что я могу помешать пользователю удалять фотографии, но как я могу справиться с непоследовательностью, от которой пострадает мое приложение?
Другой способ - позаботиться о себе. Мое приложение уже использует Core Data, поэтому я могу преобразовать медиафайлы с помощью NSValueTransformer в объект NSData и сохранить его как BLOB в Core Data. Затем есть еще несколько вопросов относительно производительности. Я знаю, что базовые данные на основе SQLite могут отлично обрабатывать базы данных размером в несколько ГБ, но загрузка больших объектов данных займет какое-то время. Очевидным преимуществом является то, что пользователь не собирается делать свое приложение непоследовательным, но допустимо ли ограничение производительности? И больше всего: если я использую UIImagePickerController для захвата фотографий и видео, он все равно сохранит его в библиотеке. Чтобы сохранить его в Core Data, мне нужно было бы сделать снимок, преобразовать его в объект NSData, сохранить его и снова удалить из библиотеки. Кажется, это не правильный путь для меня. Кроме того, UIKit предоставляет мне функцию для получения объекта NSData с фотографии через UIImageJPEGRepresentation(), но, похоже, такой функции для конвертирования видео не существует.

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

+0

См. Мой ответ в: http://stackoverflow.com/questions/10222632/can-i-access-the-files-used-for-external-binary-storage-in-core-data/13497992#13497992 I придумал «креативное» решение (лучше ли это использовать любую идею), но это позволит вам использовать Core Data для управления вашими файлами, сохраняя при этом доступ к файлам ** REAL ** по их пути. –

ответ

9

Для фото:

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

для видео: Вы можете взять данные, используя NSData *data = [NSData dataWithContentsOfFile:] или [NSData dataWithContentsOfUrl:] получить объект NSData видео. Вы можете легко получить видеоурок

Итак, я только что исправил некоторые из ваших неправильных предположений.

Не нужно сохранять его непосредственно в CoreData. Вы можете сохранить его в папке с документом приложения, а затем пользователи не смогут его удалить. Более того, сохранение в папке документа приложения и сохранение только ссылки на CoreData также спасет вашу душу от обработки большого объекта данных.

Проблема может заключаться в том, что вам необходимо иметь дело с файловым хранилищем.

Я не думаю, что здесь есть лучшая практика.

Сохранение в пользователе фотобиблиотеке поможет пользователям увидеть свои фотографии и видео проще без доступа приложения

Сохранение в CoreData может быть проще для вас и может быть быстрее, некоторое время

Сохранения в хранилище файлов может помочь вам дело не с какой-то бинарной проблемой при загрузке видео, потому что компания Apple MPMoviePlayerController может помочь вам

для меня, потому что я не использую много SQLite и Core Data, я выбираю для хранения в файловую систему

1

Используйте данные кода для хранения изображений и больших файлов.

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

enter image description here

Здесь вы функция сделать в Swift3

//Image 
let imageData = UIImageJPEGRepresentation(image, 1) // You can low compression up to >0 

//Video from URL 
let videoData = NSData(contentsOf:videoURL!) 

Ее так просто! iOS сладкое программирование.

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