Хранить фото и видео в Core Data? - PullRequest
3 голосов
/ 28 декабря 2010

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

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

Ответы [ 2 ]

9 голосов
/ 28 декабря 2010

Для фотографии :

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

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

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

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

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

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

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

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

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

* 1028я, потому что я не использую много SQLite и Core Data, я решил сохранить в файловой системе
2 голосов
/ 29 января 2017

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

Code Data может автоматически сохранять двоичные данные на диск для вас, просто установите эту опцию в свойствах атрибута, вам просто нужно активировать опцию, чтобы разрешить внешнее хранение, и 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!)

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

...