iOS SDK - Отображение # наиболее важных POI в любом отображаемом диапазоне карт

У меня есть структура данных, содержащая среди прочего:

  • NSNumber показывая важность POI (точки интереса)
  • CLLocation содержащий координаты POI.

Предположим, что я могу упорядочить POI по важности, и каждый POI имеет уникальный фактор важности, что является лучшим способом получить подмассив с POI, которые находятся внутри отображаемой области в моем MKMapView?

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

1 ответ

Решение

Я думаю, что вы ищете это:

- (NSSet *)annotationsInMapRect:(MKMapRect)mapRect

Цитирование документации Apple:

Этот метод предлагает быстрый способ извлечения объектов аннотаций в определенной части карты. Этот метод намного быстрее, чем выполнение линейного поиска объектов в свойстве аннотации самостоятельно.

Позаботьтесь о том, что это доступно только в iOS 4.2 и более поздних версиях, боюсь, в предыдущих версиях iOS нет другого решения, кроме пользовательского кода.

РЕДАКТИРОВАТЬ О вашем комментарии: я думаю, что для нескольких тысяч аннотаций, вышеупомянутый метод должен добиться цели, MKAnnotation это легкий протокол, сканирование массива путем фильтрации по координатам должно быть в порядке. Но будьте осторожны, не добавляя тысячи MKAnnotationView, который работает на iPhone 4, уже сделал это, но вы почти не можете прокрутить карту:)

Тогда я бы предложил:

  1. Используйте этот метод, быстро кодировать, легко, а затем сделать несколько тестов производительности на устройстве
  2. Если производительности недостаточно... или вы должны поддерживать предыдущие версии iOS, ничего страшного, напишите свой собственный код. (не должно быть так сложно, есть полезные методы для преобразования регионов и тому подобное)

Что касается памяти, эй, эти устройства легко имеют как минимум 64 МБ свободной памяти для вашего приложения, и в противном случае будут убивать некоторые процессы, не пугайтесь нескольких К аннотаций! Просто позаботьтесь о утечках памяти, особенно на таких интенсивных процессах.

Другие вопросы по тегам