Подтвердить что ты не робот

Основные данные для хранилища iOS в файле внешней записи

В первый раз, задавая вопрос, пожалуйста, пройдите, если я не предоставил достаточную информацию. В основном часть моего приложения iOS позволяет пользователям делать снимок, который будет храниться в хранилище основных данных. Атрибут - это тип Transformable, и я создал подкласс NSManagedObject, который я просто использую, чтобы установить его атрибут изображения на новое изображение, предоставленное пользователем.

Я знаю, что хранение больших файлов в Core Data - плохая идея, поэтому я был взволнован, когда увидел параметр "Store in External Record File" под атрибутом image в объекте Core Data. Тем не менее, производительность моего приложения говорит об обратном: за несколько секунд на iPhone 5 загружать только несколько изображений (что, как я знаю, не похоже на много времени, но учитывая, насколько мощным является iPhone 5, более старые устройства, вероятно, занимают гораздо больше времени те же данные).

Я огляделся, и некоторые люди говорят, что параметр Store in External Record File применим только к среде OS X, даже если он доступен в приложении iOS. Тем не менее, я также видел это под Apple "Что нового в iOS 5" doc (это рядом с последним элементом под основными данными, ближе к концу):

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

Итак, мой вопрос: кто прав? Правда ли, что Apple допустила ошибку в предоставлении этой опции для приложений iOS и что она фактически ничего не делает, если вы на Mac, или она действительно что-то делает, и я не настраиваю ее правильно, или это делать то, что он должен делать, и производительность в любом случае плохая?

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

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

4b9b3361

Ответ 1

кто прав?

iOS docset для класса NSAttributeDescription упоминает методы allowsExternalBinaryDataStorage и setAllowsExternalBinaryDataStorage:, поэтому мало шансов на ошибку Apple.

Вы что-то делаете неправильно или все равно медленно?

Вы сказали, что

Атрибут - тип Transformable

Но Core Data имеет тип Binary data. Возможно, только эта связь связана с возможностью внешнего хранилища.

Если это не так, у нас недостаточно информации:

  • Сколько фотографий вы храните?
  • Каковы их размеры?
  • Вы автоматически загружаете все изображения?

Кроме того, в документе Apple указано, что:

Основные данные эвристически решаются на основе стоимости...

  • Вы использовали миграцию или начинаете с нуля?

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

Надеюсь, что это поможет.

Ответ 2

Хороший вопрос!

Отметьте это сообщение: Сохранение капли во внешнем местоположении с использованием встроенного параметра CoreData

По-видимому, он должен работать. Вы также должны попробовать его в симуляторе и проверить папку данных приложения, чтобы узнать, созданы ли папки, как описано (~/Library/Application Support/iPhone Simulator/... - вы узнаете остальную часть пути). Также вы можете проверить файл sqlite с помощью команды sqlite3, чтобы узнать, находятся ли двоичные данные в базе данных.

Я лично не использовал эту опцию, так как я бы предпочел пойти вручную сохранять изображения в папке и вместо этого хранить ссылку на них в базе данных. Таким образом, будет легче создать объект UIImage из файла, который будет отображаться, лучше контролировать то, что происходит где и т.д. И т.д. Принеси какой-то дополнительный труд, хотя!

Надеюсь, что это поможет тебе.