2012-02-10 6 views
1

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

Моя проблема заключается в том, что на одном из моих пластин содержится около 5000 аннотаций, а для отображения аннотаций требуется примерно 20 секунд.

Есть ли способ ограничить количество аннотаций, загруженных до 20-километрового радиуса текущего местоположения?

Будет ли это сокращать время загрузки?

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

+0

Только вариант Я думаю, это разбить большой plist на более мелкие, покрывающие меньшие области. Затем, основываясь на текущем местоположении, загружайте только plist (s) в текущее местоположение или рядом с ним. Кроме того, «Xcode» - это только IDE, и вопрос не в IDE. Я обновил тег до «ios». – Anna

+0

Поблагодарите Анну, которая звучит как способ пойти, поэтому мне нужно было бы установить утверждение if, чтобы загрузить определенный plist, основанный на регионе между определенными долготами и широтами? Скажем, у Австралии есть 7 государств, которые я должен создать семь заявлений? –

ответ

1

Вариант, который я предлагаю, если вы хотите остаться с plists, состоит в том, чтобы разбить большой plist на более мелкие, которые покрывают меньшие регионы.

Если разбить их на 7 австралийских штатов, вы получите необходимый уровень производительности, тогда это нормально. Но вместо этого я создавал бы небольшие области (все прямоугольные), каждая из которых покрывала некоторое фиксированное число N градусов на стороне. N не должно быть слишком маленьким, но не слишком большим (это зависит от того, насколько далеко от текущего местоположения вы хотите показывать данные).

Например, вы могли бы разбить единый PLIST в 16 регионах, как это (он не должен быть квадратный номер):

  North 

     A B C D 
West E F G H East 
     I J K L 
     M N O P 

     South 

Plist «А» будет содержать данные аннотаций для Lat сказать 50 до 51 и Lon 100 до 110.
Плистер «B» будет содержать данные аннотации для лат 50-51 и Lon от 110 до 120.
Плист «E» будет содержать данные аннотации для латов 49-50 и Lon 100 to 110 .
И т.д.

У меня также был бы дополнительный «индексный» plist, который позволил бы приложению определить, какой plist заданная координата, и что это за соседи этого plist. Затем приложение может прочитать данные аннотации из plist текущего местоположения и его соседей в случае, если текущее местоположение находится рядом с краем области. Структура

Индекс Plist может выглядеть так:

PlistName NWCoordinate SECoordinate Neighbors 
A   51,100  50,110  B, E, F 
F   50,110  49,120  A, B, C, E, G, I, J, K 

Индекс PLIST будет читаться один раз в начале приложения.

Затем, когда приложение имеет текущее местоположение (или всякий раз, когда она меняется достаточно существенно), приложение будет сделать следующее:

  • Удалить существующие аннотации на карте.
  • Используйте указатель, чтобы выяснить, какие plist (ы) загружать новые аннотации. Предположим, что текущее местоположение - 49,25, 112,3. Используя индекс, приложение загружает F-plist и его соседи в некоторый массив (не непосредственно к карте по одному).
  • Добавьте аннотации в массив одним выстрелом, используя addAnnotations.
1

5 000 пунктов не очень много, у меня есть базы данных с 100 000 точками, и это все еще значительно быстрее, чем это (я не использую MapKit). Если он занимает 20 секунд, то он должен делать какой-то сетевой трафик для каждого маркера?

Содержит ли ваш plist широту/долготу каждого маркера? Если это так, вы можете создать объект CLLocation для каждого маркера на карте и объект CLLocation для центра карты, а затем использовать [mapCentre distanceFromLocation:markerLocation] для расчета расстояния (в метрах) от центра до маркера.

Отбросьте все, что нет на карте, и вам должно быть хорошо идти.

Если вы хотите разделить ваш plist на более мелкие файлы, я бы разделил их по их местоположению. Например, любой маркер, который имеет широту/долготу, начинается с 125.1/-19.1, будет в одном файле.

Мой опыт работы в Австралии, это города, такие как Мельбурн, имеют массу вещей в очень маленькой области, а остальная часть страны в значительной степени пуста. Так что трудно разделить вещи на более мелкие куски.

Кроме того, запустите приложение с помощью функции «Профиль времени» в Инструментах, чтобы узнать, что на самом деле занимает так много времени. Это пункт меню Product -> Profile в Xcode. Вы можете найти множество учебников, как использовать его в Интернете.

Смежные вопросы