С 500k записями это звучит как работа с основными данными. Желательно основные данные на рабочем столе. Если данные не обновляются в реальном времени , вам следует обработать данные на более тяжелом оборудовании и просто использовать iPhone для их отображения. Это значительно упростит приложение, потому что вы просто сохраните значение для каждой ячейки карты.
Даже если вы хотите обработать его на iPhone, приложение должно обработать данные один раз и сохранить результаты. Похоже, нет никаких причин, чтобы приложение пересчитывало значение вида каждой ячейки карты каждый раз, когда оно хочет отобразить ячейку.
Я бы предложил создать объект в основных данных для представления наблюдений. Затем другой объект для представления географических квадратов. Установите связь между квадратами и наблюдениями, которые попадают в квадрат. Затем создайте расчетную стоимость вида в квадратной сущности. Тогда вам придется только пересчитать значение вида, если одно из наблюдений изменилось.
Это та проблема, для которой были созданы графы объектов. Даже если данные постоянно обновляются. Базовые данные будут выполнять только те вычисления, которые необходимы для учета небольшого числа объектов наблюдения, которые изменились в любой момент времени, и это будет сделано с высокой степенью оптимизации.
Edit01:
Подход к проблеме с совершенно другого ракурса. В основных данных.
(1) Создайте граф объектов записей наблюдений таким образом, чтобы каждый объект наблюдения имел обратную связь с другими объектами наблюдения, которые ближе всего к нему географически. Это создаст граф объектов, который будет выглядеть как плоская нерегулярная сеть.
(2) Создать методы для класса наблюденияRecords, которые (а) определяют, лежит ли запись в границах произвольного географического квадрата (б), спрашивают, возвращают ли каждая из ее освобожденных записей, если они также находятся в квадрате (в) его собственный вид видов и количество всех связанных записей.
(3) Разделите вашу карту на несколько разумных квадратиков, например одна секунда квадрата дуги. В этом квадрате выберите одну связанную запись и добавьте ее в список. Выберите некоторый процент всех записей, например, 1 на каждые 100 или 1000, чтобы сократить список с 500 тыс. До, чтобы создать подсписок, который можно быстро найти с помощью предиката грубой силы. Давайте назовем эти записи в списке флагами сетки.
(4) Когда пользователь увеличивает масштаб, используйте грубую силу, чтобы найти все записи с меткой сетки с географической сеткой. Затем попросите каждую запись сетки флагов отправлять сообщения каждой из связанных записей, чтобы выяснить, (а) находятся ли они в сетке, (б) каков их счет видов и (в) каков их счет для связанных записей, которые также в сетке. (Используйте флаг, чтобы удостовериться, что каждая запись запрашивается только один раз за поиск, чтобы предотвратить рекурсию убегания.)
Таким образом, вам нужно найти только одну запись в каждой ячейке сетки произвольного размера, и эта запись найдет все остальные записи для вас. Вместо того чтобы проходить по каждой записи, чтобы увидеть, какая запись в какой ячейке находится каждый раз, вам просто нужно обработать записи в каждой ячейке и те, которые находятся рядом. Когда вы увеличиваете масштаб, количество записей, которые вы запрашиваете, уменьшается, а не остается постоянным. Если ячейка сетки содержит только несколько записей, вам нужно только запросить несколько записей.
Это займет некоторое усилие и время для настройки, но как только вы это сделаете, это будет довольно эффективно, особенно при увеличении. Для верхнего уровня просто подготовьте статическую карту с предварительно обработанной обработкой.
Надеюсь, я объяснил это достаточно хорошо. Трудно передать устно.