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" - имя двоичного свойства. Возможно, Вам также потребуется сохранить формат изображения, чтобы десериализовать изображение позже.
другой вариант-Сохранить Изображение на диск и сохранить путь в основных данных.