Сохранить объекты MKOverlay в Core Data

#objective-c #ios #core-data #mkmapview #mkoverlay

#objective-c #iOS #core-данные #mkmapview #mkoverlay

Вопрос:

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

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

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

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

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

Ответ №1:

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

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

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

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

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

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

Комментарии:

1. Хотя вы хотите кэшировать целую группу наложений, я бы также отметил, что можно использовать преобразователь значений для хранения отдельных экземпляров класса Objective-C в качестве объектов core data. Смотрите petermcintyre.com/topics/uiimage-in-core-data для примера с использованием UIImages

2. Да, я использую Core Data в своем проекте. Он в значительной степени зависит от этого. Что меня все еще смущает в том, как закодировать мой MKOverlay как NSData. Просмотрел документы Apple, но все еще не очень понятно.

3. Обновленный исходный ответ с подробностями кодирования и декодирования.

Ответ №2:

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

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

Комментарии:

1. Хорошо, и будет ли это просто типом NSManagedObject в core-data?

2. Казалось бы, так. Я не использовал CoreData, поэтому не могу сказать наверняка.

Ответ №3:

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

Комментарии:

1. Генри, я уже делаю это, а затем создаю MKOverlays «на лету» для пользователя. Но когда наложение имеет около 2000 местоположений, загрузка может занять несколько секунд, что я хочу исключить. Вы думаете, что я не получу никаких преимуществ в скорости от сохранения объекта MKOverlay, который уже создан?

2. Видны ли тысячи объектов одновременно на экране? Вы могли бы упростить наложение в зависимости от уровня масштабирования или если оно видно только частично, был этот пример кода от Apple (карта землетрясений или что-то в этом роде).

3. Это не метки размещения или аннотации, это наложение, которое создается из координат.

Ответ №4:

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

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

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

Комментарии:

1. Jasconius, в вашем последнем предложении вы имели в виду, что для больших наборов данных их возврат может занять много времени?

2. Да, я не хочу изменять его после написания, но мне просто нужно быстрое извлечение, а не перебирать тысячи координат, чтобы создать его, когда пользователи захотят его увидеть. Как вы думаете, что лучше записать в плоский файл или в core data? Что было бы быстрее?

3. Если ваши данные представляют собой просто скалярные типы, то я не понимаю, каким образом Core Data может быть быстрее, чем просто создание плоского файла с помощью NSCoder. Даже если это быстрее, разница должна быть минимальной, а NSCoder намного проще реализовать. Не уверен, что вы подразумеваете под циклом. Насколько я понимаю, MKOverlay в любом случае выполняет множество последовательных циклов.

4. Под циклом я подразумевал, что я перебираю массив моих сохраненных координат, которые были сохранены в Core Data как NSSet. Это занимает несколько секунд, чего я не хочу заставлять пользователя ждать. Я полностью за сохранение MKOverlay в файловой системе, но не понимаю, как использовать NSCoder. Я думаю, если это путь, то мне нужно какое-то указание, с чего начать. Посмотрел документы Apple и все еще немного запутался.