Основные данные - сохранение изображений (iPhone) - программирование
Подтвердить что ты не робот

Основные данные - сохранение изображений (iPhone)

У меня есть приложение, где я разрешаю пользователю добавлять изображение для своей учетной записи.

Я хочу знать, как сохранить изображение (полученное из камеры или библиотеки фотографий) с использованием Core Data​​strong > , так как я могу предложить средство резервного копирования для пользователя и будет искать передачу изображения данных на сервер.

Я столкнулся с конструктивным предложением создания объекта модели Image и создания отношения 1 к 1 с объектом модели User (так что связанный объект Image не вызывается, если не требуется). Тем не менее, я не уверен, как практически сохранить изображение и является ли это потенциально опасным с точки зрения производительности.

Я был бы признателен за любые советы по подходу и ловушкам от тех, кто попытался это сделать.

4b9b3361

Ответ 1

Правило для хранения данных изображения в Core Data выглядит следующим образом:

  • < 100 кб в соответствующем объекте (лицо, адрес, что угодно).
  • < 1 мб хранить в отдельном объекте на другом конце отношения, чтобы избежать проблем с производительностью.
  • 1 мб хранить на диске и ссылаться на путь в вашем хранилище основных данных.

Вы можете использовать преобразованный тип данных для хранения NSImage непосредственно в Core Data. Фактически вы можете использовать преобразованный тип данных для хранения всего, что реализует протокол NSCoder.

Лично я бы не преобразовал его в CGImageRef, так как вы можете потерять много информации таким образом.

Ответ 2

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


Я бы не рекомендовал вам хранить изображения внутри БД, если их число не ограничено. Вы всегда должны помнить, что когда-нибудь вы добавите новую версию модели данных, и вам придется перейти от старой БД к новой версии приложения. Это займет время. Чем больше вы DB файл, тем больше требуется перенос.

Если вы хотите хранить изображения в БД, не добавляйте постоянное хранилище в метод application: didFinishLaunchingWithOptions: UIApplicationDelegate. iOS прекратит ваше приложение, если миграция не будет завершена за XX секунд.

Ответ 3

Pitfall: вы можете получить огромную, сложную для обработки базу данных sqlite. Вы действительно хотите, чтобы ваши пользователи загружали несколько файлов MB за один шаг на сервер? Что вы делаете, если соединение celluar разрывается на несколько секунд?

Я думаю, было бы лучше, если бы вы использовали Core Data для управления вашими изображениями и их статусом загрузки (загружено: да или нет). Таким образом, вы можете загружать изображения, когда они соответствуют вашему рабочему процессу приложения. Хорошо, это продлится немного дольше, из-за многих соединений. Но я считаю, что это более чистый подход.

Когда вы думаете об iTunes, когда речь идет о резервных копиях: в любом случае синхронизируется ваша локальная папка "Документы" iPhone.

Ответ 4

У вас должен быть a a, тогда вы можете сделать что-то вроде этого:

CGImageRef imageRef = uiImage.CGImage;
CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef);
NSData *imageData = (NSData*)CGDataProviderCopyData(dataProvider);
[managedObject setValue:imageData forKey:@"data"];

Где managedObject - ваш основной объект изображения данных, а @ "data" - это имя бинарного свойства. Возможно, вам также понадобится сохранить формат изображения, чтобы позднее десериализовать изображение.

Другой вариант - сохранить изображение на диске и сохранить путь в основных данных.