Core Data-хранение изображений (iPhone)

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

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

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

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

4 ответов


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

  • 1 Мб хранить на диске и ссылаться на путь в хранилище основных данных.

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

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


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


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

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


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

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

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


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

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

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

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