Сохраняйте объекты MKOverlay в Core Data - PullRequest
1 голос
/ 08 ноября 2011

У меня есть большой MKOverlay, который я хотел бы сохранить в Core Data, чтобы мне не пришлось создавать его позже.Поскольку это не один из типов, которые вы можете выбрать в Core Data, как мне сохранить его?

Нужно ли сначала как-то его кодировать?

Нужно ли мне декодировать его при использовании?

Какой тип объекта я выбираю в core data при создании нового свойства?

Спасибо, ребята.

Ответы [ 4 ]

1 голос
/ 09 ноября 2011

Если вам не нужно запрашивать различные оверлеи, и вы не используете основные данные в другом месте вашего проекта, то вам, вероятно, лучше кэшировать оверлей на диск как закодированный NSArray.

ОднакоЕсли вы уже используете Core Data или кэшируете несколько оверлеев, вы можете кодировать / декодировать оверлей в поле типа NSData.Добавьте дополнительные поля к объекту, чтобы можно было запрашивать конкретное наложение, которое вы ищете.

В iOS 5 вы можете включить дополнительное хранение полей NSData во внешнем файле, выбрав «Разрешить внешнее хранение»вариант.Базовые данные будут применять эвристику, основанную на размере, чтобы определить, приведет ли блоб или внешний файл к лучшей производительности.

MKOverlay соответствует NSCoding, поэтому вы можете кодировать и декодировать весь массив объектов MKOverlay, используя метод кодированияNSKeyedArchiver и сохраните результат в двоичном поле в вашей сущности.Скорее всего, вам понадобятся + (NSData *) archivedDataWithRootObject: (id) rootObject для NSKeyedArchiver и + (id) unarchiveObjectWithData: (NSData *) данные для NSKeyedUnarchiver

См. Раздел Архивы в руководстве по программированию архивов и сериализаций дляподробности о создании архива с ключами по адресу: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Archiving/Articles/archives.html

Вы можете написать собственный метод доступа для двоичного поля сущности, которое кодирует и декодирует оверлейный массив для вас.Другой вариант - создать преобразователь значения, который инкапсулирует операции кодирования и декодирования.Конечным результатом будет свойство массива оверлеев, которое вы можете установить и прочитать с помощью entity.overlays.

1 голос
/ 08 ноября 2011

Я полагаю, что вы можете использовать библиотеки NSCoding от Apple для преобразования объекта в сериализованное состояние и обратно. Однако Core Data может поддерживать сохранение объектов, но NSCoding позволяет вам сохранить любой класс, который его реализует в любом месте , включая строку, отправленную на сервер, файл, записанный на диск, или, если вы так плохо программист как я, запись NSUserDefaults.

edit- Возможно, вам придется реализовать NSCoding в своем собственном классе на основе MKOverlay, добавив методы чтения и записи, я не уверен.

0 голосов
/ 09 ноября 2011

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

Я имею в виду, вы, вероятно, МОЖЕТЕ просто NSCoder целиком объединить в один гигантский блок данных,но в этот момент вы могли бы также просто записать объект в плоский файл (что, честно говоря, может быть лучше, если все, что вы хотите сделать, это прочитать / записать его, не меняя его).

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

0 голосов
/ 09 ноября 2011

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

...